2010-03-10 3 views
8

Я использую традиционный клиент веб-сервиса C#, сгенерированный в VS2008 .Net 3.5, наследующий от SoapHttpClientProtocol. Это подключение к удаленной веб-службе, написанной на Java.Как настроить клиент веб-службы C# для отправки заголовка и тела запроса HTTP параллельно?

Все настройки выполняются в коде во время инициализации клиента, и его можно увидеть ниже:

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

Это все работает отлично, но время, необходимое для выполнения простейшего вызова метода почти в два раза время сеть пинг. В то время как тестовый клиент Java занимает примерно такой же, как время сеть пинг:

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

После анализа TCP трафика для сеанса обнаружили следующее:

В принципе, 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. 

Клиент Java отправил 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. 

Есть в любом случае для настройки C# веб-службы клиента, чтобы отправить заголовок/тело параллельно, как клиент Java, как представляется?

Любая помощь или указатели очень ценится.

+0

Можете ли вы понюхать заголовки http для запроса .Net и запроса Java и сравнить их? (И я думаю, что java-клиент использует тот же прокси) –

+0

извините, когда я говорю прокси, я имею в виду как в прокси-классе, а не http-прокси – Christopher

+0

отредактированный текст, чтобы удалить ссылки на «прокси» и заменить на «клиент» – Christopher

ответ

0

Я думаю, вы можете использовать унаследованный метод EndGetRequestStream для взлома SoapHttpClientProtocol. Сохраните это до буфера, пока запрос не будет завершен. Затем сделайте свой собственный поток и полностью вытолкните его.

1

Спасибо за ответ Роб, в конце концов я решил использовать генерацию прокси-сервера Add Service/WCF, которая делает это по умолчанию. Вероятно, потому, что он использует новые HTTP-библиотеки внизу.

У меня было несколько проблем с генератором прокси-сервера WCF с методами SOAP, которые возвращают необработанные массивы сложных объектов (т. Е .: возвращение объекта, содержащего массив объектов, работавших нормально). Чтобы обойти это, вам нужно либо обернуть ваши массивы в объекты, либо переключить конфигурацию сервера SOAP с RPC на DOCUMENT (что мы и сделали).