我们正在使用来自WCF(http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24644)的“Rest toolkit”的HttpClient类来交换我们创建的Rest服务器。
服务器当前总是关闭连接,无论“连接”标头(它正在开发中,所以现在可以)。
如何告诉HttpClient实例始终关闭连接(或接受服务器关闭它)?我尝试添加“Connection:close”标头,但导致了一个exeption(“连接”不是允许的标头)。我也尝试设置DefaultHeaders.Connection.Close = true,但这似乎没有任何区别。 POST完成后我仍然可以看到与netstat的连接。
( 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时,调用只是阻塞。我们认为这是由于客户端保持连接这一事实,服务器不支持此功能。
答案 0 :(得分:5)
我写了大部分的HttpClient代码;这里有一些想法:
你不需要告诉HttpClient接受关闭连接的服务器 - 它应该只是自动工作 - 无论客户端是否包含“Connection:close”标题,服务器总是可以关闭连接
使用response.Dispose() - 在读取待处理的字节之前,底层连接可能无法启动新连接/发送字节
client.DefaultHeaders.Add(“Connection”,“close”);应该工作 - 如果你得到例外,请在codeplex网站上打开一个问题
您可以检查response.Request.Headers以查看线路上发生的事情
你可以在Post(新的Uri(x))中跳过“new Uri()” - 传递一个字符串将为你调用正确的构造函数(new Uri(x,UriKind.RelativeOrAbsolute))
默认情况下,超时与HttpWebRequest相同 - 您可能希望通过client.TransportSettings.ReadWriteTimeout / client.TransportSettings.ConnectionTimeout将其关闭以区分永久阻塞和超时
答案 1 :(得分:0)
完成后,您是否尝试过处理响应?
// do stuff
res.Dispose();
或
using (HttpResponseMessage res = client.Post(new Uri(uri), content))
{
// do stuff
}