2010-03-10 30 views
8

Tôi đang sử dụng máy khách dịch vụ web C# truyền thống được tạo trong VS2008 .Net 3.5, kế thừa từ SoapHttpClientProtocol. Điều này đang kết nối với một dịch vụ web từ xa được viết bằng Java.Làm cách nào để định cấu hình ứng dụng khách dịch vụ web C# để gửi tiêu đề và nội dung yêu cầu HTTP song song?

Tất cả các cấu hình được thực hiện trong mã trong quá trình khởi khách hàng, và có thể được nhìn thấy dưới đây:

 ServicePointManager.Expect100Continue = false; 
     ServicePointManager.DefaultConnectionLimit = 10; 

     var client = new APIService 
     { 
      EnableDecompression = true, 
      Url = _url + "?guid=" + Guid.NewGuid(), 
      Credentials = new NetworkCredential(user, password, null), 
      PreAuthenticate = true, 
      Timeout = 5000 // 5 sec 
     }; 

Tất cả đều hoạt động tốt, nhưng thời gian thực hiện để thực hiện gọi phương thức đơn giản nhất là gần như gấp đôi so với thời gian mạng ping. Trong khi đó, một bài kiểm tra khách hàng Java mất gần giống như thời gian mạng ping:

C# client ~ 550ms 
Java client ~ 340ms 
Network ping ~ 300ms 

Sau khi phân tích lưu lượng TCP cho một phiên phát hiện ra như sau:

Về cơ bản, C# khách hàng gửi các gói tin TCP theo trình tự sau .

Client Send HTTP Headers in one packet. 
Client Waits For TCP ACK from server. 
Client Sends HTTP Body in one packet. 
Client Waits For TCP ACK from server. 

Máy khách Java đã gửi gói TCP theo trình tự sau.

Client Sends HTTP Headers in one packet. 
Client Sends HTTP Body in one packet. 
Client Revieves ACK for first packet. 
Client Revieves ACK for second packet. 
Client Revieves ACK for second packet. 

Có cách nào để định cấu hình ứng dụng khách C# web để gửi tiêu đề/nội dung song song với trình khách Java xuất hiện không?

Bất kỳ trợ giúp hoặc con trỏ nào được đánh giá cao.

+0

Bạn có thể ngửi tiêu đề http cho yêu cầu .Net và yêu cầu java và so sánh chúng không? (Và tôi đoán khách hàng java sử dụng cùng một proxy) –

+0

xin lỗi, khi tôi nói proxy tôi có nghĩa là trong lớp proxy, thay vì http proxy – Christopher

+0

văn bản đã chỉnh sửa để xóa tham chiếu đến 'proxy' và thay thế bằng 'khách hàng' – Christopher

Trả lời

0

Tôi nghĩ bạn có thể sử dụng phương pháp EndGetRequestStream được kế thừa để hack SoapHttpClientProtocol. Lưu nó vào bộ đệm cho đến khi yêu cầu kết thúc. Sau đó tạo luồng của riêng bạn và đẩy tất cả ra ngay lập tức.

1

Cảm ơn bạn đã trả lời Rob, cuối cùng tôi đã chọn sử dụng tính năng Thêm dịch vụ tham chiếu/WCF proxy, thực hiện việc này theo mặc định. Có lẽ vì nó sử dụng các thư viện HTTP mới hơn bên dưới.

Tôi đã có một vài vấn đề phát sinh proxy WCF với các phương thức SOAP trả về mảng thô của các đối tượng phức tạp (ví dụ: trả về một đối tượng chứa một mảng đối tượng hoạt động tốt). Để làm tròn điều này, bạn phải quấn các mảng của bạn vào các đối tượng, hoặc chuyển cấu hình máy chủ SOAP từ RPC sang DOCUMENT (đó là những gì chúng ta đã làm).

Các vấn đề liên quan