2011-02-15 6 views
9

GetResponseでタイムアウトを取得せずにPOSTで大きな文字列(私の場合はBLOBでXML)をアップロードするにはどうすればよいですか?C#:WebRequest経由で大きな文字列をPOSTする方法は?

タイムアウトを変更すると役立ちますが、これは実際の解決策ではありません。 サーバが本当に死んでいるか、POSTが中断した場合は、極端に大きなタイムアウトを待たなければなりません。

HttpWebRequest webRequest = null; 
string response = ""; 
byte[] bytes = Encoding.UTF8.GetBytes(xml); 

try 
{ 
    webRequest = (HttpWebRequest)WebRequest.Create("http://" + this.host + ":" + this.port); 
    webRequest.ContentType = "application/x-www-form-urlencoded"; 
    webRequest.Method = "POST"; 
    webRequest.Timeout = 5000; 

    webRequest.ContentLength = bytes.Length; 
    using (Stream requeststream = webRequest.GetRequestStream()) 
    { 
     requeststream.Write(bytes, 0, bytes.Length); 
     requeststream.Close(); 
    } 

    using (HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse()) 
    { 
     using (StreamReader sr = new StreamReader(webResponse.GetResponseStream())) 
     { 
      response = sr.ReadToEnd().Trim(); 
      sr.Close(); 
     } 
     webResponse.Close(); 
    } 
} 
catch(Exception ex) 
{ 
    MessageBox.Show(ex.ToString()); 
} 
return response; 
+0

アプリケーションを設計する必要があります。 –

+0

私の話題は同じです。 「プラットフォーム」がそれをサポートしていないことが分かったら、別の方法でそれを試してみてください。それ以外の場合は、@Marc Gravellのgzip圧縮と制限付きアップロード数のアプローチに行きます。 –

答えて

3

はい、これはかなり期待されるHTTPの動作です。

オプション:

  • は(あなたはすでにこれをやった)大きなタイムアウトを持っている、とあるため、帯域幅の間を取るとは対照的に、それは(合法時間外に長い時間がかかることがありますことを受け入れます)
  • あなたはgzipをリクエストに適用することができます。私は正直なところこれがサポートされているかどうかわかりません自動的にですが、特定のヘッダーを明示的にチェックし、ペイロードにgzip圧縮解除を適用することで確実に行うことができます
  • apiを変更して、あなたは文句を言わないデータの非常に大きな金額をPOSTする必要がなるようにと、完了メッセージ
  • はそれと一緒に暮らす
+8

私はその最後のオプションを試しても、動作していないようです。 –

+0

残念ながら、WebServiceはXML文字列のみを受け入れます。その後、私は長いタイムアウトを使用する必要があります。ありがとう – Wowa

関連する問題