2010-11-23 14 views
3

"基本接続が閉じられました:接続が予期せず閉じられました。"プロダクションサーバーでHttpWebRequestクラスを使用してPOSTしようとしたときにエラーが発生しました。私の開発マシンではうまくいきます。基本接続HttpWebRequestで閉じたPOSTプロダクションサーバーで

私はもともとWebClientクラスを使ってみましたが、問題を研究中に見つけた提案のいくつかを試みるためにHttpWebRequestに切り替えました(PreAluthenticate 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); */ 

感謝を使用してみましたコードですが、任意の助けいただければ幸いです。

EDIT:ターゲットフレームワーク(私はテストのための新しいプロジェクトを使用)に設定した場合、私はこの情報

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 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 = ""を設定しようとしましたが、diffrenceを作成していないようです。私はフィドラーで何を探すべきか分かりませんが、私はその情報で自分の投稿を更新しています。 – Jack

+0

私は自分の答えを更新しました。 – Aliostad

+0

ご協力ありがとうございます。私は応答を取得しようとしましたHttpWebResponse response =(HttpWebResponse)HttpWReq.GetResponse();それは戻ってきている(401)Unauthorized。 Fidlerのデータについては、投稿されたデータがヘッダーのRawビュー(インスペクタタブの下)から間違った情報を探している可能性があります。 – Jack

関連する問題