我们使用 WCF 的“Rest 工具包”中的 HttpClient 类 ( http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24644 ) 来连接我们创建的 Rest 服务器。
服务器当前总是关闭连接,无论“连接” header 如何(它正在开发中,所以现在可以)。
如何告诉 HttpClient 实例始终关闭连接(或接受服务器关闭连接)?我尝试添加“Connection: close” header ,但导致出现异常(“connection”不是允许的 header )。我还尝试设置 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 时,调用就会阻塞。我们认为这是因为连接是由客户端保持事件的,而服务器不支持这一点。
最佳答案
我编写了大部分 HttpClient 代码;以下是一些想法:
您不需要告诉 HttpClient 接受服务器关闭连接 - 它应该自动工作 - 无论客户端是否包含“Connection: close” header ,服务器始终可以关闭连接
使用response.Dispose() - 底层连接可能无法启动新连接/发送字节,直到您完成读取待处理的字节
client.DefaultHeaders.Add("连接", "关闭");应该可以——如果您遇到异常,请在 codeplex 网站上提出问题
您可以检查response.Request.Headers以查看线路上发生了什么
您可以跳过 Post(new Uri(x)) 中的“new Uri()”——传递字符串将为您调用正确的构造函数 (new Uri(x, UriKind.RelativeOrAbsolute))
默认情况下,超时与 HttpWebRequest 相同 - 您可能希望通过 client.TransportSettings.ReadWriteTimeout/client.TransportSettings.ConnectionTimeout 将其关闭,以区分永远阻塞和超时
关于c# - 在 WCF 中使用 HttpClient 强制关闭连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/968657/