HttpWebRequest底层连接已关闭。

4
我将使用HttpWebRequest通过Web服务发送一个字节数组图片,图片大小大约是byte[4096]
代码:
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(wsHost);
webRequest.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip,deflate");
webRequest.Headers.Add(HttpRequestHeader.KeepAlive, "true");

I get an error:

The underlying connection was closed. A connection that was expected to be kept alive was closed by the server

这是服务器问题还是我的发布问题?


当你设置 webRequest.KeepAlive = false; 时会发生什么? - Simon Whitehead
我把它改成了false,但错误仍然存在。问题是该帖子在Fiddler中未登录。 - Kev Fixes
我假设你已经进行了调试,并发现 wsHost 实际上是你要发布的有效 URL? - Simon Whitehead
这是Fiddler代理的问题,它关闭了连接。我该如何使其支持更大的数据提交? - Kev Fixes
你正在使用旧版本的Fiddler吗?这里有人描述了类似的问题:https://groups.google.com/forum/?fromgroups=#!topic/httpfiddler/0-Ew7uRVDFc - JoshVarty
1个回答

6
这可能有很多原因。否则,您能连接到服务器吗?如果可以,请尝试通过以下方式在进行POST之前关闭“预期的100继续”:
System.Net.ServicePointManager.Expect100Continue = false;

根据HTTP 1.1协议,当发送此标题时,表单数据不会随初始请求一起发送。相反,此标题将发送到Web服务器,如果正确实现,则响应为100(继续)。但是,并非所有Web服务器都正确处理此项,包括我正在尝试发布数据的服务器。 来源:http://haacked.com/archive/2004/05/15/http-web-request-expect-100-continue.aspx 如果这不起作用,另一个资源:http://geekswithblogs.net/Denis/archive/2005/08/16/50365.aspx建议通过将请求构建为HTTP 1.0请求来解决问题。
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(wsHost);
webRequest.KeepAlive = false;
webRequest.ProtocolVersion=HttpVersion.Version10;

是的,我已经将它关闭了。这只会在字节数组很大时发生。 - Kev Fixes
也许你应该编辑一下你的初始帖子,列出你尝试过的所有不同方法?这个问题发生的原因有很多,我希望不要一直建议你已经尝试过的东西。 - JoshVarty
我正在使用 Fiddler,它关闭了连接。 - Kev Fixes
我可以在我的Wcf服务客户端上设置KeepAlive属性,但如何设置协议版本? - FernandoZ
顺便说一句,我的客户端应用程序在其他机器上运行良好。但是在我的电脑上无法运行,这意味着我无法调试其他问题。看起来它在运行了大约一年的Windows 7更新后停止工作了。 - FernandoZ
仍然无法工作,我正在尝试使用代理,因此出现了这个错误。如果我删除代码中的代理部分,那么它就可以正常工作。但是,我想设置代理,否则在另一端的其他人会阻止我的请求 :) - Vlado Pandžić

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接