c# - 在 WCF 中使用 HttpClient 强制关闭连接

标签 c# wcf http rest

我们使用 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 的连接。

(bodyuri 是字符串)

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/

相关文章:

c# - 设置 Windows/AD 密码,使其成为 "never expires"?

c# - 我如何在 C# 中运行无限循环

c# - JObject ToString 与 StringEnumConverter 不工作

c# - AutoMapper:字符串到可为空的 int

http.Redirect() 带标题

javascript - API、后端和前端作为所有三个独立的组件

Java HTTP 请求卡住

c# - 新手 LINQ - 使用 XDocument 读取、过滤 XML

c# - 具有相同返回类型和名称的 MessageBodyMembers 导致异常 - 元素已导出

wcf - Web API 2.0 - 如何验证 ASP.NET Web API 中的传入请求,类似于 WCF AfterReceiveRequest(IDispatchMessageInspector 成员)