Tôi đang cố di chuyển một dự án web api (dự án web.config cổ điển) ở đó sử dụng PushStreamContent cho ứng dụng web asp.net 5 mới nhất (project.json).PushStreamContent trong asp.net 5/mvc 6 không hoạt động
Vấn đề của tôi là tôi không thể tải PushStreamContent để hoạt động.
Khi tôi sử dụng bộ điều khiển api này - kết quả là sẽ kết thúc trong một định dạng json và không phải là một dòng:
[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);
}
}
Nếu tôi thay đổi hành động điều khiển để trả về một nhiệm vụ và quấn PushStreamContent trong một MyPushStreamResult lớp - Như thế này:
[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);
}
}
Yêu cầu hành động điều khiển của tôi hiện đang trả về luồng, BẮT luồng không được xả trước khi đóng trên máy chủ hoặc chứa nhiều dữ liệu. Khi tôi đẩy dữ liệu vào dòng đầu ra PushStreamContent tôi xả sau mỗi lần soạn văn bản, nhưng tôi đoán rằng lệnh xóa không nằm trên luồng response.Body.
Tôi bỏ lỡ điều gì? Không thể tìm thấy bất kỳ mẫu nào có cấu trúc asp.net 5.
tính năng 'IHttpBufferingFeature' có thể giúp tôi nghĩ, bạn có cố vô hiệu hóa bộ đệm không? –
có vẻ như 'IHttpBufferingFeature' không được hỗ trợ trong Kestrel [docs] (http://docs.asp.net/en/latest/fundamentals/servers.html#supported-features-by-server) –
Trong ví dụ đầu tiên bạn không bao giờ viết thư cho luồng. – usr