我有一个针对AspNetCore 2.2的REST API,该API的端点允许下载一些大的json文件。迁移到AspNetCore 3.1后,此代码停止工作:
try
{
HttpContext.Response.StatusCode = (int)HttpStatusCode.OK;
HttpContext.Response.Headers.Add("Content-Type", "application/json");
using (var bufferedOutput = new BufferedStream(HttpContext.Response.Body, bufferSize: 4 * 1024 * 1024))
{
await _downloadService.Download(_applicationId, bufferedOutput);
}
}
catch (Exception ex)
{
_logger.LogError(ex, ex.Message);
}
这是下载方法,它创建了我想在HttpContext.Response.Body中返回的json:
public async Task Download(string applicationId, Stream output, CancellationToken cancellationToken = default(CancellationToken))
{
using (var textWriter = new StreamWriter(output, Constants.Utf8))
{
using (var jsonWriter = new JsonTextWriter(textWriter))
{
jsonWriter.Formatting = Formatting.None;
await jsonWriter.WriteStartArrayAsync(cancellationToken);
//write json...
await jsonWriter.WritePropertyNameAsync("Status", cancellationToken);
await jsonWriter.WriteValueAsync(someStatus, cancellationToken);
await jsonWriter.WriteEndArrayAsync(cancellationToken);
}
}
}
现在,我得到一个例外:“ ASP.NET Core 3.0中不允许进行同步操作”如何在不使用AllowSynchronousIO = true的情况下更改此代码以使其工作;
AllowSynchronousIO
选项默认是禁用的,从.Net core 3.0.0-preview3
在(Kestrel
,HttpSys
,IIS in-process
,TestServer
),因为这些API是线程饥饿和应用程序挂起的来源。
每个临时迁移请求都可以覆盖该选项:
var allowSynchronousIoOption = HttpContext.Features.Get<IHttpBodyControlFeature>();
if (allowSynchronousIoOption != null)
{
allowSynchronousIoOption.AllowSynchronousIO = true;
}
您可以找到更多信息,并遵循ASP.NET Core问题跟踪器:在所有服务器中禁用AllowSynchronousIO
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句