最近在試著串接AI模型的Web API,發現它是使用串流JSON的回傳方式,對我來說這方式很新鮮,於是就查了ASP.NET是否有支援這樣的回傳方式,發現只要安裝套件就可以了。

首先是透過nuget安裝JsonStreamer.SystemTextJson,然後在Program.cs加入下列程式碼:

builder.Services.AddControllers().AddJsonStreamer();

在controller,就是依序回傳物件就好:

public async IAsyncEnumerable<ResponseModel> GetJSONStream()
{
    yield return new ResponseModel { Id = Guid.NewGuid().ToString(), Message = "aaa3" };
    await Task.Delay(100);
    yield return new ResponseModel { Id = Guid.NewGuid().ToString(), Message = "aaa4" };
    await Task.Delay(100);
    yield return new ResponseModel { Id = Guid.NewGuid().ToString(), Message = "aaa5" };
    await Task.Delay(100);
    yield return new ResponseModel { Id = Guid.NewGuid().ToString(), Message = "aaa6" };
}

API部份只有這樣,而在測試上,可以利用下列程式碼來測試:

HttpClient client = new HttpClient();
client.BaseAddress = new Uri(_host);
var jsonResponse = await client.GetAsync(@"/MyAPI/GetJSONStream");

Stream? stream = await jsonResponse.Content.ReadAsStreamAsync();
var r = ReadJsonStreamMultipleContent(stream);
int count = 0;
foreach (string item in r)
{
    if (item != null)
    {
        Console.Write(item);
        Console.WriteLine();
    }
    await Task.Delay(1);
    count++;
}
Console.WriteLine();
Console.WriteLine(count.ToString());

原本想透過POSTMAN來測試,但發現看不出效果。

參考資料