我们正在使用WCF的"Rest toolkit"中的HttpClient类(http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24644)来连接我们创建的Rest服务器.
服务器当前总是关闭连接,无论"连接"标头(它正在开发中,所以现在可以).
如何告诉HttpClient实例始终关闭连接(或接受服务器关闭它)?我尝试添加"Connection:close"标头,但导致了一个exeption("连接"不是允许的标头).我也尝试设置DefaultHeaders.Connection.Close = true,但这似乎没有任何区别.POST完成后我仍然可以看到与netstat的连接.
(身体和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);
Run Code Online (Sandbox Code Playgroud)
这里的问题是,下次我们进行POST时,调用只是阻塞.我们认为这是由于客户端保持连接这一事实,服务器不支持这一点.
小智 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将其关闭以区分永久阻塞和超时
归档时间: |
|
查看次数: |
7068 次 |
最近记录: |