IAsyncEnumerable이 ASP.NET 웹 API와 작동하는 방식에 대한 설명


9

ASP.NET 웹 API 프로젝트에서 IAsyncEnumerable을 탐색하는 동안 흥미로운 동작이 발생했습니다. 다음 코드 샘플을 고려하십시오.

    // Code Sample 1
    [HttpGet]
    public async IAsyncEnumerable<int> GetAsync()
    {
        for (int i = 0; i < 10; i++)
        {
            await Task.Delay(1000);
            yield return i;
        }
    }


    // Code Sample 2
    [HttpGet]
    public async IAsyncEnumerable<string> GetAsync()
    {
        for (int i = 0; i < 10; i++)
        {
            await Task.Delay(1000);
            yield return i.ToString();
        }
    }

샘플 1 (int 배열)은 {}JSON 결과로 반환 됩니다.

샘플 2는 예상 결과를 반환합니다 ["0","1","2","3","4","5","6","7","8","9"]. 그러나 10 초 동안 기다린 후 전체 JSON 배열이 한 번에 반환됩니다. IAsyncEnumerable 인터페이스에서 예상대로 데이터를 사용할 수있게되면 반환되지 않아야합니까? 아니면이 웹 API를 사용해야하는 특정 방법이 있습니까?


4
IAsyncEnumerable 인터페이스에서 예상대로 데이터를 사용할 수있게되면 반환되지 않아야합니까? ... 그리고 그것은 ...하지만 json serializer를
Selvin

1
그리고 샘플 1 .... 비 참조 유형에 대한 버그 인 것 같습니다 (변경 IAsyncEnumerable<int>하면 IAsyncEnumerable<object>작동하지만 권투가 관련됩니다)
Selvin

@Selvin, 좀 더 자세히 설명해 주시겠습니까? 아니면 코드 샘플을 가리 킵니까? 나는 C #을 클라이언트이 API를 소비했는데, 결과는 동일, 10 초 동안 기다릴 필요가 ...
라비 M 파텔

10 초 동안 기다려야합니다 ... 직렬화는 서버 측에 있으며 비동기 적이 지 않습니다 ... 무엇에 대해 자세히 설명합니까?
Selvin

답변:


3

웹 API 호출은 매초 부분 json을 반환하지 않습니다. 10x1second (또는 ASP .NET의 일부인 json serialiser를 호출하는 코드)를 기다려야하는 json serialiser입니다. 프레임 워크 코드와 시리얼 라이저가 모든 데이터를 가져 오면 클라이언트에게 단일 응답으로 직렬화됩니다.

에서 ASP.NET 코어 웹 API의 컨트롤러 액션 반환 형식 우리가 읽을 수 있습니다 :

ASP.NET Core 3.0 이상에서 동작에서 IAsyncEnumerable을 반환합니다.

  • 더 이상 동기 반복이 발생하지 않습니다.
  • IEnumerable을 반환하는 것만 큼 효율적입니다.

ASP.NET Core 3.0 이상은 다음 작업의 결과를 serializer에 제공하기 전에 버퍼링합니다.

public IEnumerable<Product> GetOnSaleProducts() =>
  _context.Products.Where(p => p.IsOnSale);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.