2011-09-02 23 views
5

お願いします。 投稿のクエリを送信した後、私はwebexceptionを持っています "応答ストリーム(ReadDone2)を取得中にエラーが発生しました:受信失敗"。このエラーを取り除くのに役立ちます。ありがとう。私の場合は応答ストリーム(ReadDone2)を取得中にエラーが発生しました:受信エラー

コードの一部

try 
{ 
string queryContent = string.Format("login={0}&password={1}&mobileDeviceType={2}/", 
login, sessionPassword, deviceType); 
request = ConnectionHelper.GetHttpWebRequest(loginPageAddress, queryContent); 

using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())//after this line //occurs exception - "Error getting response stream (ReadDone2): Receive Failure" 
{ 

ConnectionHelper.ParseSessionsIdFromCookie(response); 

string location = response.Headers["Location"]; 
if (!string.IsNullOrEmpty(location)) 
{ 
string responseUri = Utils.GetUriWithoutQuery(response.ResponseUri.ToString()); 
string locationUri = Utils.CombineUri(responseUri, location); 
result = this.DownloadXml(locationUri); 
} 
response.Close(); 
} 
} 
catch (Exception e) 
{ 
errorCout++; 
errorText = e.Message; 
} 

// Methot GetHttpWebRequest

public static HttpWebRequest GetHttpWebRequest(string uri, string queryContent) 
    { 
     HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(uri);    
     request.Proxy = new WebProxy(uri); 
     request.UserAgent = Consts.userAgent; 
     request.AutomaticDecompression = DecompressionMethods.GZip; 
     request.AllowWriteStreamBuffering = true; 
     request.AllowAutoRedirect = false; 

     string sessionsId = GetSessionsIdForCookie(uri); 
     if (!string.IsNullOrEmpty(sessionsId)) 
      request.Headers.Add(Consts.headerCookieName, sessionsId); 

     if (queryContent != string.Empty) 
     { 
      request.ContentType = "application/x-www-form-urlencoded"; 
      request.Method = "POST"; 
      byte[] SomeBytes = Encoding.UTF8.GetBytes(queryContent); 
      request.ContentLength = SomeBytes.Length; 
      using (Stream newStream = request.GetRequestStream()) 
      { 
       newStream.Write(SomeBytes, 0, SomeBytes.Length); 
      } 
     } 
     else 
     { 
      request.Method = "GET"; 
     } 

     return request; 
    } 
+0

でなければなりませんが、あなたはConnectionHelperクラスのコード(または多分ちょうどGetHttpWebRequest法)を投稿することができますか? – clarkb86

答えて

0
using (Stream newStream = request.GetRequestStream()) 
{ 
    newStream.Write(SomeBytes, 0, SomeBytes.Length); 

    //try to add 
    newStream.Close(); 
} 
+1

'using'キーワードを使用する場合は、明示的にClose()関数を呼び出す必要がありますか?私はストリームが 'using'ステートメントの範囲外になったときにストリームが自動的に処理され/閉じられたと考えました。 –

+0

私もそうだと思っていますが、実際には.Close()を使わないとリクエストを送信しません。 – mironych

0

サーバは、応答本体を送信しませんでした。サーバーを修理した後、 "Receive Failure"が消えた。

だから、2つのオプションがあります。あなたはそれなしで生きることができるならば

  1. は、応答ストリームを要求しないでくださいを。

  2. サーバーが応答本文を送信していることを確認してください。

    例えば、代わりに

    self.send_response(200) 
    self.wfile.close() 
    

    のPythonのサーバー・コードは

    self.send_response(200) 
    self.send_header('Content-type', 'text/plain') 
    self.end_headers() 
    self.wfile.write("Thanks!\n") 
    self.wfile.close() 
    
関連する問題