2017-03-13 10 views
3

ASP.NETコアで応答を適切にストリーミングする方法はありますか? このようなコントローラ(更新されたコード)があります:ASP.NETコアでストリーミングする方法

[HttpGet("test")] 
public async Task GetTest() 
{ 
    HttpContext.Response.ContentType = "text/plain"; 
    using (var writer = new StreamWriter(HttpContext.Response.Body)) 
     await writer.WriteLineAsync("Hello World");    
} 
クローム/ポストマンがエラーを報告しながら、

のFirefox /エッジブラウザは、

Hello World

を示しています。

The localhost page isn’t working

localhost unexpectedly closed the connection.

ERR_INCOMPLETE_CHUNKED_ENCODING

P.S.は、私は多くのコンテンツをストリーミングしようとしているので、Content-Lengthヘッダーを事前に指定することはできません。

答えて

4

をダウンロードしたファイルなどのブラウザに表示されます応答をストリーミングするには、あなたがFileStreamResultを使用する必要があります。

[HttpGet] 
public FileStreamResult GetTest() 
{ 
    var stream = new MemoryStream(Encoding.ASCII.GetBytes("Hello World")); 
    return new FileStreamResult(stream, new MediaTypeHeaderValue("text/plain")) 
    { 
    FileDownloadName = "test.txt" 
    }; 
} 
+0

実際に私のデータソースは 'Stream'ではありません - SomeReaderまたはIEnumerableです。私は 'Stream'アダプタが必要になりますが、これはかなり面倒です。 'Response.Body'に書き込む簡単な方法はありますか? P.P.それはいくつかの人のためにクロムで動作します:) –

+1

@DmitryNogin:あなたが必要とするかもしれない['FileCallbackResult'を書いた](http://blog.stephencleary.com/2016/11/streaming-zip-on-aspnet -core.html)。 –

1

このような何かがうまくいくかもしれない:

[HttpGet] 
public async Task<IActionResult> GetTest() 
{ 
    var contentType = "text/plain"; 
    using (var stream = new MemoryStream(Encoding.ASCII.GetBytes("Hello World"))) 
    return new FileStreamResult(stream, contentType); 

} 
+2

あなたのコードはあなたので動作しませんソースストリームが使用される前に処理してください。 –

+0

良い点、私は他のことをしている間にあまりにも速く答えました –

+0

技術的には、このメソッドが返されるまでストリームは読み込まれないため、まだ良くありません。しかし、 'MemoryStream'の' Dispose'はストリームの内容を破棄しないので、ここでそれを取り除きます。実際のIOでは、おそらくそれほど幸運ではありません。 – spender

関連する問題