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

时间:2010-11-23 18:53:00

标签: c# asp.net iis httpwebrequest

我收到“基础连接已关闭:连接意外关闭。”尝试使用生产服务器上的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中处理安全性的方式不同。这不是解决方案,但我希望有人可以使用该信息来帮我解决这个问题。

2 个答案:

答案 0 :(得分:2)

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

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

您似乎正在使用Windows身份验证,尝试将其关闭以查看是否会出现问题 - 显然您无法一直关闭此功能,只需查看行为是什么。

<强>更新

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

  

Mozilla / 4.0(兼容; MSIE 7.0;   Windows NT 5.1;三叉戟/ 4.0; GTB6.5;   InfoPath.2; .NET CLR 2.0.50727; 。净   CLR 3.0.4506.2152; .NET CLR 3.5.30729;   .NET CLR 1.1.4322)

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

我还注意到你没有得到可能与之相关的回复。你需要调用request.GetResponseStream并阅读它。

答案 1 :(得分:0)

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

<强>更新

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

最后,我能够使用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);