底层连接在HttpWebRequest POST上关闭在生产服务器上

我得到了“底层连接已关闭:连接意外关闭。” 尝试使用生产服务器上的HttpWebRequest类进行POST时出错,在我的开发机器上运行正常。

我最初尝试使用WebClient类,但我转而使用HttpWebRequest来尝试我在研究问题时找到的一些建议(例如将KeepAlive设置为false,将PreAuthenticate设置为true,将ProtocolVersion设置为1.0)。

由于它只发生在生产服务器上,我猜它可能与IIS有关。

这是我的代码

HttpWebRequest HttpWReq = (HttpWebRequest)WebRequest.Create(webURL); ASCIIEncoding encoding=new ASCIIEncoding(); Byte[] postbytes = Encoding.ASCII.GetBytes(data); HttpWReq.Headers.Add("Authorization", String.Format("Basic {0}", authstring)); HttpWReq.KeepAlive = false; HttpWReq.PreAuthenticate = true; HttpWReq.Credentials = CredentialCache.DefaultCredentials; HttpWReq.UseDefaultCredentials = true; HttpWReq.ProtocolVersion = HttpVersion.Version10; HttpWReq.Method = "POST"; HttpWReq.ContentType = "application/x-www-form-urlencoded"; HttpWReq.ContentLength = postbytes.Length; Stream newStream = HttpWReq.GetRequestStream(); newStream.Write(postbytes, 0, postbytes.Length); newStream.Close(); 

我最初尝试使用WebClient类的代码

  /* WebClient client = new WebClient(); client.Headers.Add("Authorization", String.Format("Basic {0}", authstring)); client.Headers.Add("Content-Type", "application/x-www-form-urlencoded"); client.UseDefaultCredentials = true; System.Net.ServicePointManager.Expect100Continue = false; Byte[] postbytes = Encoding.ASCII.GetBytes(data); byte[] resp = client.UploadData(webURL, "POST", postbytes); */ 

谢谢,任何帮助将不胜感激。

编辑:

使用fidler来检查标题我得到了这个信息

 POST [MyWebSite] HTTP/1.1 Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave- flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, */* Referer: [MyWebSite] Accept-Language: en-us User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; GTB6.5; InfoPath.2; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 1.1.4322) Content-Type: application/x-www-form-urlencoded Accept-Encoding: gzip, deflate Host: [MyHost] Content-Length: 188 Connection: Keep-Alive Pragma: no-cache Cookie: __utma=62854692.1254171006.1276438746.1289273298.1289317993.21; __utmz=62854692.1277743505.3.3.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=yeled; ASPSESSIONIDQQQRCRAT=ANNHGGNBNOFNFCLHPBEJIMLC __VIEWSTATE=%2FwEPDwUKMjA0OTM4MTAwNGRktZi0IsIUo6MOCYTxun8p8Po4AWeTtipGZ4L9%2FkY3KZU%3D&__EVENTVALIDATION=%2FwEWAgLHhsXtBwK14deQBbiFCpWBnsp%2BicqBy%2FNXAkhuVDX9WF1jZayRuTgPc3Ov&btnTest=Test 

EDIT2

如果将目标框架(我使用一个新项目进行测试)设置为2.0(我没有测试框架的每个版本),它就可以工作。 我猜测.net在.net 4.0中处理安全性的方式不同。 这不是解决方案,但我希望有人可以使用该信息来帮我解决这个问题。

这是一个保持活力和100-continue的典型例子。 到目前为止我看到的所有案例都是由于这个问题所以我会说你走在正确的轨道上。

首先,使用Fiddler获取请求原始视图以查看您的请求是什么样的。 我打赌你有Expect:100-continue在那里。 所以试试HttpWReq.Expect="";

您似乎正在使用Windows身份validation,尝试关闭它以查看是否可能会出现问题 – 显然您不能一直关闭它,只需查看行为是什么。

UPDATE

首先,我几乎可以肯定这与你发送的请求不一样。 这是用户代理,它告诉我它不是你的HttpWebRequest:

Mozilla / 4.0(兼容; MSIE 7.0; Windows NT 5.1; Trident / 4.0; GTB6.5; InfoPath.2; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 1.1 0.4322)

还有视图状态让我相信这只是浏览的另一个请求。 也不是1.1的协议。

我也注意到你没有得到可能与它有关的响应。 您需要调用request.GetResponseStream并读取它。

它似乎是一个权限问题。 如果我将IIS上的应用程序池帐户从ASP.net更改为NTService,则会正确发布。 我将尝试找出它需要哪个特定权限,看看我是否可以将其授予asp.net帐户。

UPDATE

我不确定它究竟是做了什么,但在更改了服务器上运行的用户帐户的一些写权限并重新启动后,它现在正在运行。

最后,我能够使用WebClient包装器类。

  WebClient client = new WebClient(); client.Headers.Add("Authorization", String.Format("Basic {0}", authstring)); client.Headers.Add("Content-Type", "application/x-www-form-urlencoded"); client.UseDefaultCredentials = true; byte[] resp = client.UploadData(url, "POST", postbytes);