Принудительное закрытие соединения с HttpClient в WCF - PullRequest
0 голосов
/ 09 июня 2009

Мы используем класс HttpClient из "Rest toolkit" для WCF (http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24644) для взаимодействия с созданным нами Rest-сервером.

Сервер в настоящее время всегда закрывает соединение, независимо от заголовка «соединения» (он в разработке, так что пока все нормально).

Как я могу сказать экземпляру HttpClient всегда закрывать соединение (или принимать, что сервер его закрывает)? Я попытался добавить заголовок «Connection: close», но это привело к исключению («connection» не был разрешенным заголовком). Я также пытался установить DefaultHeaders.Connection.Close = true, но, похоже, это не имело никакого значения. Я все еще вижу соединение с netstat после завершения POST.

( body и uri являются строками)

HttpClient client = new HttpClient();
client.DefaultHeaders.Connection = new Connection();
client.DefaultHeaders.Connection.Close = true;
HttpContent content = HttpContent.Create(body);
HttpResponseMessage res = client.Post(new Uri(uri), content);

Проблема в том, что в следующий раз, когда мы выполняем POST, вызов просто блокируется. Мы думаем, что это связано с тем, что клиент поддерживает соединение, а сервер не поддерживает его.

Ответы [ 2 ]

5 голосов
/ 04 августа 2009

Я написал большую часть кода HttpClient; вот некоторые мысли:

Вам не нужно указывать HttpClient принять сервер, закрывающий соединение - он должен просто работать автоматически - сервер всегда может закрыть соединение, независимо от того, содержит ли клиент заголовок «Connection: close»

Использовать response.Dispose () - базовое соединение может не иметь возможности инициировать новое соединение / отправлять байты, пока вы не закончите чтение ожидающих байтов

client.DefaultHeaders.Add («Соединение», «закрыть»); должно работать - если вы получаете исключение, пожалуйста, откройте вопрос на сайте codeplex

Вы можете проверить ответ. Запрос. Заголовки, чтобы увидеть, что происходит на проводе

Вы можете пропустить "new Uri ()" в Post (new Uri (x)) - передача строки вызовет правильный конструктор (new Uri (x, UriKind.RelativeOrAbsolute)) для вас

По умолчанию время ожидания такое же, как и у HttpWebRequest - вы можете отключить их через client.TransportSettings.ReadWriteTimeout / client.TransportSettings.ConnectionTimeout, чтобы различать блокировку навсегда и тайм-аут

0 голосов
/ 09 июня 2009

Вы пытались избавиться от ответа, когда закончили с ним?

// do stuff
res.Dispose();

или

using (HttpResponseMessage res = client.Post(new Uri(uri), content))
{
    // do stuff
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...