docker - AllowSynchronousIO设置为true,但仍会出现异常

标签 docker asp.net-core io

我有一个输出格式化程序,可以使用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/

相关文章:

linux - 使用 mmap 和大页面随机读取大文件

c - 使用 O_CREAT 调用 open() 的默认模式是什么以及如何在打开/创建文件时正确设置它

Docker 通过 ssh 连接到远程守护进程 - 权限被拒绝(公钥)

docker - Jenkins Pipeline和Docker插件-基于唯一代理的并发构建

bash - Docker 终端中的 Docker 行数在 docker 内部发生变化

mysql - 在容器中找不到 Docker MariaDB 卷?

c# - JWT 访问 token 与刷新 token (创建)

c# - ASP .NET Core 2 本地化获取新语言的所有字符串

c# - LinkGenerator GetPathByPage 对于区域页面返回 null

c - 如何快速转储信息?