我有一个输出格式化程序,可以使用XSLT将消息格式化为XML并添加一些内容。
public override Task WriteResponseBodyAsync(OutputFormatterWriteContext context)
{
try
{
var response = context.HttpContext.Response;
string xml = GetXMLFromObject(context.Object);
var accept = context.HttpContext.Request.Headers["Accept"].FirstOrDefault();
response.ContentType = accept;
var templateFile = context.HttpContext.Request.Headers["Template"].FirstOrDefault();
ExcelProvider.ConvertToStream(templateFile, xml, response.Body);
return Task.CompletedTask;
}
catch
{
throw;
}
}
我同时配置了IISServerOptions和KestrelServerOptions以启用SynchronousIO services.Configure<IISServerOptions>(options =>
{
options.AllowSynchronousIO = true;
});
services.Configure<KestrelServerOptions>(options =>
{
options.AllowSynchronousIO = true;
});
但是,当我发送请求时,出现异常fail: Project.Api.Middleware.ExceptionMiddleware[0]
Synchronous operations are disallowed. Call WriteAsync or set AllowSynchronousIO to true instead.
System.InvalidOperationException: Synchronous operations are disallowed. Call WriteAsync or set AllowSynchronousIO to true instead.
at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpResponseStream.Flush()
at System.Xml.XmlUtf8RawTextWriter.Close()
at System.Xml.XmlRawWriter.Close(WriteState currentState)
at System.Xml.XmlWellFormedWriter.Close()
at System.Xml.XmlWriter.Dispose(Boolean disposing)
at System.Xml.XmlWriter.Dispose()
at System.Xml.Xsl.XslCompiledTransform.Transform(IXPathNavigable input, XsltArgumentList arguments, Stream results)
at Project.Common.ExcelProvider.ConvertToStream(String templateFile, String data, Stream stream) in /src/Project.Common/ExcelProvider.cs:line 28
at Project.Api.Formatters.ExcelOutputFormatter.WriteResponseBodyAsync(OutputFormatterWriteContext context) in /src/Project.Api/Formatters/ExcelOutputFormatter.cs:line 34
at Microsoft.AspNetCore.Mvc.Formatters.OutputFormatter.WriteAsync(OutputFormatterWriteContext context)
at Microsoft.AspNetCore.Mvc.Infrastructure.ObjectResultExecutor.ExecuteAsyncCore(ActionContext context, ObjectResult result, Type objectType, Object value)
at Microsoft.AspNetCore.Mvc.Infrastructure.ObjectResultExecutor.ExecuteAsync(ActionContext context, ObjectResult result)
at Microsoft.AspNetCore.Mvc.ObjectResult.ExecuteResultAsync(ActionContext context)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeResultAsync(IActionResult result)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.ResultNext[TFilter,TFilterAsync](State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeNextResultFilterAsync[TFilter,TFilterAsync]()
--- End of stack trace from previous location where exception was thrown ---
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResultExecutedContextSealed context)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.ResultNext[TFilter,TFilterAsync](State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeResultFilters()
--- End of stack trace from previous location where exception was thrown ---
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeFilterPipelineAsync>g__Awaited|19_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
at Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext)
at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider)
at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
at Project.Api.Middleware.ExceptionMiddleware.InvokeAsync(HttpContext context) in /src/Project.Api/Middleware/ExceptionMiddleware.cs:line 24
fail: Microsoft.AspNetCore.Server.Kestrel[13]
Connection id "0HM2OMURFR65H", Request id "0HM2OMURFR65H:00000001": An unhandled exception was thrown by the application.
System.ArgumentException: An item with the same key has already been added.
at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpHeaders.ThrowDuplicateKeyException()
at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpHeaders.System.Collections.Generic.IDictionary<System.String,Microsoft.Extensions.Primitives.StringValues>.Add(String key, StringValues value)
at Project.Api.Middleware.ExceptionMiddleware.HandleExceptionAsync(HttpContext context, Exception ex) in /src/Project.Api/Middleware/ExceptionMiddleware.cs:line 42
at Project.Api.Middleware.ExceptionMiddleware.InvokeAsync(HttpContext context) in /src/Project.Api/Middleware/ExceptionMiddleware.cs:line 29
at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ProcessRequests[TContext](IHttpApplication`1 application)
我不知道我需要改变什么。难道我做错了什么?我的应用已 docker 化,并通过docker-compose up
运行version: '3'
services:
#mssql docker
project-sql:
image: mcr.microsoft.com/mssql/server:2017-latest-ubuntu
restart: unless-stopped
environment:
- ACCEPT_EULA=Y
- SA_PASSWORD=QWElkj132!
- MSSQL_PID=Developer
ports:
- 1401:1433
networks:
- projectnet
project-api:
restart: unless-stopped
build:
context: .
environment:
- ConnectionStrings:FitBody=Server=project-sql,1433;Database=FitBody;User=sa;Password=QWElkj132!;ConnectRetryCount=0
ports:
- 58744:80
networks:
- projectnet
links:
- project-sql
depends_on:
- project-sql
networks:
projectnet:
driver: bridge
最佳答案
从外观上看,您似乎已经在启动中正确地允许了同步IO,所以建议您尝试docker-compose up --build
。这将重新构建所有内容,因为Docker倾向于使用现有资源,因此即使您更改了某些内容,这些更改也可能不会出现。
关于docker - AllowSynchronousIO设置为true,但仍会出现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63886056/