代码之家  ›  专栏  ›  技术社区  ›  Jack Ishu

在生产服务器上的HttpWebRequest POST上关闭了基础连接

  •  3
  • Jack Ishu  · 技术社区  · 14 年前

    我得到的是“底层连接已关闭:连接意外关闭。”在生产服务器上尝试使用HttpWebRequest类发布时出错,在我的开发计算机上它工作正常。

    我最初尝试使用WebClient类,但是我切换到HttpWebRequest来尝试在研究这个问题时发现的一些建议(例如将KeepAlive设置为false,PreAuthenticate true 以及ProtocolVersion到1.0)。

    因为它只发生在生产服务器上,我猜它可能与i i s有关。

    这是我的密码

            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
    

    编辑2

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

    2 回复  |  直到 14 年前
        1
  •  2
  •   Aliostad    14 年前

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

    首先,使用Fiddler获取请求raw视图,以查看请求的外观。我打赌你有 Expect:100-continue 在里面。所以试试看 HttpWReq.Expect="";

    似乎您正在使用Windows身份验证,请尝试将其关闭,以查看这是否会造成问题-显然您不能一直将其关闭,只需查看行为是什么。

    更新

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

    Mozilla/4.0(兼容;MSIE 7.0; Windows NT 5.1;三叉戟/4.0;GTB6.5; 信息路径.2;.NET CLR 2.0.50727;.NET CLR 3.0.4506.2152;.NET CLR 3.5.30729; .NET清除1.1.4322)

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

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

        2
  •  0
  •   Jack Ishu    14 年前

    这似乎是权限问题。如果我将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);