2010-03-10 1 views
8

저는 SoapHttpClientProtocol에서 상속받은 VS2008 .Net 3.5에서 생성 된 전통적인 C# 웹 서비스 클라이언트를 사용하고 있습니다. 이것은 Java로 작성된 원격 웹 서비스에 연결하고 있습니다.HTTP 요청 헤더와 본문을 병렬로 전송하도록 C# 웹 서비스 클라이언트를 구성하려면 어떻게해야합니까?

모든 구성은 클라이언트 초기화하는 동안 코드에서 수행되며, 아래에 볼 수 있습니다 :

 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 
     }; 

그것은 모두 잘 작동하지만 간단한 메서드 호출을 실행하는 데 걸리는 시간은 거의 두 배 네트워크 핑 시간입니다. 자바 테스트 클라이언트가 네트워크 핑 시간과 거의 동일합니다 반면 : 세션의 TCP 트래픽을 분석 한 후

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

다음 발견 : 기본적으로

를,는 C# 클라이언트는 다음과 같은 순서로 TCP 패킷을 전송 .

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. 

자바 클라이언트가 다음 순서로 TCP 패킷을 보냈습니다.

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. 

Java 클라이언트가 나타날 때 헤더/본문을 병렬로 보내도록 C# 웹 서비스 클라이언트를 구성해야합니까?

도움이나 조언을 많이 주시면 감사하겠습니다.

+0

.Net 요청 및 java 요청에 대한 http 헤더를 스니핑하고 비교할 수 있습니까? (그리고 자바 클라이언트가 같은 프록시를 사용하는 것 같아요.) –

+0

프록시라고하면 프록시라고하는 대신 http 프록시가 아닌 – Christopher

+0

편집 된 텍스트가 '프록시'에 대한 참조를 제거하고 '클라이언트'로 바뀝니다. – Christopher

답변

0

당신이 상속 된 EndGetRequestStream 메서드를 사용하여 SoapHttpClientProtocol을 해킹 할 수 있다고 생각합니다. 요청이 완료 될 때까지 버퍼에 저장하십시오. 그런 다음 자신 만의 스트림을 만들어 즉시 모두 푸시하십시오.

1

답장을 보내 주셔서 감사합니다. Rob, 결국 Add Service Reference/WCF proxy generation을 사용하기로 선택했습니다.이 생성은 기본적으로이 작업을 수행합니다. 아마도 새로운 HTTP 라이브러리를 사용하고 있기 때문일 것입니다.

복잡한 객체의 원시 배열을 반환하는 SOAP 메서드에 몇 가지 WCF 프록시 생성 문제가있었습니다. 즉, 일련의 객체가 포함 된 객체를 반환하는 것이 좋습니다. 이 과정을 거치려면 배열에서 객체를 래핑하거나 SOAP 서버 구성을 RPC에서 DOCUMENT로 전환해야합니다 (이는 우리가 한 일입니다).

관련 문제