2010-11-23 88 views
3

我收到“底层连接已关闭:连接意外关闭”。尝试使用生产服务器上的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); */ 

由于最初试图代码,任何帮助,将不胜感激。

编辑:

使用菲德勒检查我得到这个信息

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中处理安全性不同。这不是一个解决方案,但我希望有人可以使用该信息来帮助我解决这个问题。

回答

0

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

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

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

看来您正在使用Windows身份验证,请尝试关闭此功能以查看是否可能导致问题 - 显然您无法一直关闭该功能,只能看看有什么行为。

UPDATE

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

的Mozilla/4.0(兼容; MSIE 7.0; 的Windows NT 5.1;三叉戟/ 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)

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

我也注意到,你没有得到可能对此做出的回应。你需要调用request.GetResponseStream并读取它。

+0

我试着设置HttpWReq.Expect =“”它似乎没有作出差别。我不确定如何寻找与提琴手,但我更新我的信息与该信息。 – Jack 2010-11-23 20:11:07

相关问题