Как я настраиваю клиент веб-сервиса C# для отправки заголовка Запроса HTTP и тела параллельно?

Я использую традиционный клиент веб-сервиса 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
        };

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

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, кажется?

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

8
задан Christopher 10 March 2010 в 17:13
поделиться

2 ответа

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

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

1
ответ дан 6 December 2019 в 02:24
поделиться

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

0
ответ дан 6 December 2019 в 02:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: