Как настроить клиент веб-службы C # для параллельной отправки заголовка и тела HTTP-запроса? - PullRequest
8 голосов
/ 10 марта 2010

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

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

        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-клиенте?

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

Ответы [ 2 ]

1 голос
/ 29 апреля 2010

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

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

0 голосов
/ 28 апреля 2010

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

...