it-swarm-ko.tech

ASP.NET Core로 스트리밍하는 방법

ASP.NET Core에서 응답을 올바르게 스트리밍하는 방법은 무엇입니까? 다음과 같은 컨트롤러가 있습니다 (PDATED CODE).

[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/Edge 브라우저 표시

안녕하세요 월드

Chrome/Postman에서 오류를보고하는 동안 :

로컬 호스트 페이지가 작동하지 않습니다

localhost가 예기치 않게 연결을 닫았습니다.

ERR_INCOMPLETE_CHUNKED_ENCODING

추신 많은 콘텐츠를 스트리밍하려고하므로 콘텐츠 길이 헤더를 미리 지정할 수 없습니다.

17
Dmitry Nogin

다운로드 한 파일처럼 브라우저에 표시되어야하는 응답을 스트리밍하려면 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"
  };
}
20
Stephen Cleary

이전에 Response.Body에 쓸 때에도 null 또는 EmptyResult() (동등한)을 반환 할 수 있습니다. 메소드가 다른 모든 결과를 쉽게 사용할 수 있도록 ActionResult를 리턴하면 유용 할 수 있습니다 (예 : BadQuery()).

[HttpGet("test")]
public ActionResult Test()
{
    Response.StatusCode = 200;
    Response.ContentType = "text/plain";
    using (var sw = new StreamWriter(Response.Body))
    {
        sw.Write("something");
    }
    return null;
}
4
Martin Staufcik

이 작업을 수행하는 방법도 궁금해서 원래 질문의 코드가 실제로 ASP.NET Core 2.1.0-rc1-final, Chrome (및 다른 브라우저) 및 JavaScript 응용 프로그램 모두 해당 엔드 포인트에서 실패하지 않습니다.

내가 추가하고 싶은 사소한 것은 StatusCode를 설정하고 응답 스트림을 닫아 응답을 이행하는 것입니다.

[HttpGet("test")]
public void Test()
{
    Response.StatusCode = 200;
    Response.ContentType = "text/plain";
    using (Response.Body)
    {
        using (var sw = new StreamWriter(Response.Body))
        {
            sw.Write("Hi there!");
        }
    }
}
2
ivandz

이 질문은 조금 오래되었지만, 내가하려는 일에 대한 더 나은 대답을 찾을 수 없었습니다. 속임수는 작성하려는 각 콘텐츠 덩어리에 대해 새로운 StreamWriter를 여는 것입니다. 간단히 다음을 수행하십시오.

[HttpDelete]
public void Content()
{
    Response.StatusCode = 200;
    Response.ContentType = "text/html";

    // the easiest way to implement a streaming response, is to simply open a new stream writer every time
    // you have new data to write. When the writer is closed, the data will be sent to the client.
    foreach (var item in new int[] { 1, 2, 3, 4, })
    {
        using (var sw = new StreamWriter(Response.Body))
        {
            Thread.Sleep(1000);
            sw.Write($"<p>Hi there {item}!</p>");
        }
    };
}

다음 명령을 사용하여 curl로 테스트 할 수 있습니다. curl -NX DELETE <CONTROLLER_ROUTE>/content

0
Developer 4993