Web API プロジェクト (従来の web.config プロジェクト) を移行しようとしており、PushStreamContent を最新の asp.net 5 Web アプリ (project.json) に使用しています。
私の問題は、PushStreamContent を動作させることができないことです。
この api コントローラーを使用すると、結果はストリームではなく json 形式になります。
[Route("api/[controller]")]
public class EventsController : Controller
{
private static readonly ConcurrentQueue<StreamWriter> s_streamWriter = new ConcurrentQueue<StreamWriter>();
[HttpGet]
public HttpResponseMessage Get(HttpRequestMessage request)
{
HttpResponseMessage response = request.CreateResponse();
response.Content = new PushStreamContent(new Action<Stream, HttpContent, TransportContext>(WriteToStream), "text/event-stream");
return response;
}
private void WriteToStream(Stream outputStream, HttpContent headers, TransportContext context)
{
var streamWriter = new StreamWriter(outputStream) {AutoFlush = true};
s_streamWriter.Enqueue(streamWriter);
}
}
コントローラのアクションを変更してタスクを返し、クラス MyPushStreamResult で PushStreamContent をラップすると、次のようになります。
[HttpGet]
public async Task<IActionResult> Get(HttpRequestMessage request)
{
var stream = new PushStreamContent(new Action<Stream, HttpContent, TransportContext>(WriteToStream), "text/event-stream");
return new MyPushStreamResult(stream, "text/event-stream");
}
public class MyPushStreamResult : ActionResult
{
public string ContentType { get; private set; }
public PushStreamContent Stream { get; private set; }
public MyPushStreamResult(PushStreamContent stream, string contentType)
{
Stream = stream;
ContentType = contentType;
}
public override async Task ExecuteResultAsync(ActionContext context)
{
var response = context.HttpContext.Response;
response.ContentType = ContentType;
await Stream.CopyToAsync(response.Body);
}
}
コントローラーアクションへのリクエストはストリームを返すようになりましたが、サーバー側で閉じる前にストリームがフラッシュされていないか、大量のデータが含まれています。データを PushStreamContent 出力ストリームにプッシュすると、各テキスト書き込み後にフラッシュしますが、フラッシュは response.Body ストリームにはないと思います。
何が恋しいですか?asp.net 5 構造のサンプルが見つかりません。