0

次のようにWeb APIコントローラーを使用しています:

[HttpPost]    
public HttpResponseMessage PostMethod(string filename)    
{
    Stream downloadStream = BL.method(fileName);    
    HttpResponseMessage response = new HttpResponseMessage();    
    response.content= new StreamContent(downloadStream);    
    return response;    
}

フィドラーを使用して上記のメソッドを呼び出そうとすると、例外が発生します

「downloadStream.ReadTimeout」が「System.InvalidOperationException」タイプの例外をスローしました。

ストリームをレスポンスに設定して送信できますか? 上記のコードに変更はありますか?

4

2 に答える 2

0

PushStreamContent を使用してみてください。ファイルをメモリにバッファリングしないことで、タイムアウトを回避できる可能性があります。

    [HttpPost]
    public HttpResponseMessage PostMethod(string filename)
    {
        Stream downloadStream = BL.method(fileName);
        HttpResponseMessage response = new HttpResponseMessage();
        response.Content = new PushStreamContent((responseStream, httpContent, tc) => {
                                                     downloadStream.CopyTo(responseStream);
                                                     responseStream.Close();
                                                 }, "application/octet-stream");

        return response;
    }
于 2012-10-13T15:55:49.710 に答える
0

ストリームに問題があるようです。ストリームがどのように生成されるかを知らなければ、それを言うのは困難です。BL.method(fileName);これを使用して自分でファイルをロードするだけで置き換えると、うまくいくFileStreamはずです(私は自分でテストしました)。

ちなみに、あなたのアプローチにはいくつかの問題があります。

  1. POST を使用します。何も変更していないので、GETの方が優れています。
  2. ContentTypeヘッダーを設定していないため、クライアントはリソースの使用に問題が発生する可能性があります
  3. ストリームを破棄していないため、このストリームは宙に浮いたままになり、一般的には良くありません。
于 2012-10-13T12:39:20.463 に答える