こんにちは、動的に生成されたコンテンツを Web API にアップロードしたいと考えています。クライアントでは、HttpWebRequest を使用します。データは同期してアップロードする必要があり、HTTP 要求を実行した後 (!) にストリームに書き込みたいと考えています。
(サーバーからクライアントへは正常に動作しますが、クライアントからサーバーへはいくつかの例外があります)。
クライアントの実装は次のようになります。
HttpWebRequest httpWebRequest = HttpWebRequest.Create(myUrl) as HttpWebRequest;
httpWebRequest.Method = "POST";
httpWebRequest.Headers["Authorization"] = "Basic " + ... ;
httpWebRequest.PreAuthenticate = true;
httpWebRequest.SendChunked = true;
//httpWebRequest.AllowWriteStreamBuffering = false; //does not help...
httpWebRequest.ContentType = "application/octet-stream";
Stream st = httpWebRequest.GetRequestStream();
Task<WebResponse> response = httpWebRequest.GetResponseAsync();
// NOW: Write after GetResponse()
var b = Encoding.UTF8.GetBytes("Test1");
st.Write(b, 0, b.Length);
b = Encoding.UTF8.GetBytes("Test2");
st.Write(b, 0, b.Length);
b = Encoding.UTF8.GetBytes("Test3");
st.Write(b, 0, b.Length);
st.Close();
var x = response.Result;
Stream resultStream = x.GetResponseStream();
//do some output...
stream.write() で例外が発生します (NotSupportedException: The stream does not support parallel IO read or write operations.)。
ここで例外が発生するのはなぜですか。場合によっては、最初の書き込みが機能し、後の書き込みで例外がスローされることがあります。最初は stream.CanWrite プロパティは true ですが、1 回目または 2 回目または 3 回目の書き込みの後は false になります...そして、次の書き込みで例外がスローされます。
編集:AllowWriteStreamBufferingを変更しても役に立たなかった
付録: 問題が見つかりました。この問題は、私のコードの順序が原因です。次の順序で呼び出す必要があります。
- GetRequestStream (ストリームへの非同期書き込み) (リクエストは最初の書き込みの後にサーバーに送信されます) の場合:
- GetResponseAsync()
- GetResponseStream()
「GetResponseAsync」がクライアントをトリガーしてリクエストを送信すると思いました(今のところヘッダーのみ)。ただし、最初のビットをストリームに書き込んだ後、要求は既に送信されているため、必要ありません。
私の問題の 2 番目の原因: Fiddler。(Fiddler は現在、要求ではなく、応答のストリーミングのみをサポートしています)