强制连接以在WCF中使用HttpClient关闭

时间:2009-06-09 07:31:14

标签: c# wcf http rest

我们正在使用来自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时,调用只是阻塞。我们认为这是由于客户端保持连接这一事实,服务器不支持此功能。

2 个答案:

答案 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
}