- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在互联网上搜索了几个小时后,我对如何解决 ASP.NET Core 2.x 的问题迷失了方向。
我正在即时生成 CSV(可能需要几分钟),然后尝试将其发送回客户端。许多客户端在我开始发送响应之前超时,因此我尝试将文件流式传输回它们(立即响应 200 响应)并异步写入流。 PushStreamContent
似乎可以做到这一点以前在 ASP 中,但我不确定如何构建我的代码,以便异步完成 CSV 生成并立即返回 HTTP 响应。
[HttpGet("csv")]
public async Task<FileStreamResult> GetCSV(long id)
{
// this stage can take 2+ mins, which obviously blocks the response
var data = await GetData(id);
var records = _csvGenerator.GenerateRecords(data);
// using the CsvHelper Nuget package
var stream = new MemoryStream();
var writer = new StreamWriter(stream);
var csv = new CsvWriter(writer);
csv.WriteRecords(stream, records);
await writer.FlushAsync();
return new FileStreamResult(stream, new MediaTypeHeaderValue("text/csv))
{
FileDownloadName = "results.csv"
};
}
Task.Run()
中但这也没有帮助我的问题。
最佳答案
没有 PushStreamContext
一种内置于 ASP.NET Core 的类型。但是,您可以 build your own FileCallbackResult
它做同样的事情。此 example code应该这样做:
public class FileCallbackResult : FileResult
{
private Func<Stream, ActionContext, Task> _callback;
public FileCallbackResult(MediaTypeHeaderValue contentType, Func<Stream, ActionContext, Task> callback)
: base(contentType?.ToString())
{
if (callback == null)
throw new ArgumentNullException(nameof(callback));
_callback = callback;
}
public override Task ExecuteResultAsync(ActionContext context)
{
if (context == null)
throw new ArgumentNullException(nameof(context));
var executor = new FileCallbackResultExecutor(context.HttpContext.RequestServices.GetRequiredService<ILoggerFactory>());
return executor.ExecuteAsync(context, this);
}
private sealed class FileCallbackResultExecutor : FileResultExecutorBase
{
public FileCallbackResultExecutor(ILoggerFactory loggerFactory)
: base(CreateLogger<FileCallbackResultExecutor>(loggerFactory))
{
}
public Task ExecuteAsync(ActionContext context, FileCallbackResult result)
{
SetHeadersAndLog(context, result, null);
return result._callback(context.HttpContext.Response.Body, context);
}
}
}
[HttpGet("csv")]
public IActionResult GetCSV(long id)
{
return new FileCallbackResult(new MediaTypeHeaderValue("text/csv"), async (outputStream, _) =>
{
var data = await GetData(id);
var records = _csvGenerator.GenerateRecords(data);
var writer = new StreamWriter(outputStream);
var csv = new CsvWriter(writer);
csv.WriteRecords(stream, records);
await writer.FlushAsync();
})
{
FileDownloadName = "results.csv"
};
}
FileCallbackResult
具有与
PushStreamContext
相同的限制: 如果回调中发生错误,Web 服务器没有好的方法通知客户端该错误。您所能做的就是传播异常,这将导致 ASP.NET 提前关闭连接,因此客户端会收到“连接意外关闭”或“下载中止”错误。这是因为 HTTP 在正文开始流式传输之前首先在 header 中发送错误代码。
关于c# - 在 ASP.NET Core 中流式传输内存中生成的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56458452/
我正在尝试将资源/流设置为 Android 中的墙纸。我使用 WallpaperManager 类及其方法 setResource/setStream 来执行此操作。我通常在将图像设置为墙纸之前使用
我正在编写脚本来通过反复取消对象直到 EOF 来处理(非常大的)文件。我想对文件进行分区并让单独的进程(在云中)解开并处理单独的部分。 但是我的分区器并不智能,它不知道文件中 pickle 对象之间的
我正在实现图形表示。 Map>> g = new HashMap<>(); Graph 类中的一个方法是 List> getAllEdges() { List> allEdges = new
我正在通过 MediaCodec 处理实时流,并且有一个场景,其中 MediaFormat 在流中更改(即:正在解码的视频的分辨率发生更改)。鉴于我将解码器附加到 Surface 以在我检测到传入流的
嗨 iCoders 目前我正在开发一个使用 OpenTok/TokBox iOS SDK 进行直播的应用程序。我怀疑有多少订阅者可以订阅发布者发布的流。我在 openTok 论坛中搜索过这个但是没有找
我是一名优秀的程序员,十分优秀!