.netcore System.InvalidOperationException: Response Content-Length mismatch

原创
2020/12/25 13:04
阅读数 3.1K
System.InvalidOperationException: Response Content-Length mismatch

首先说明下在什么应用场景下出现此错误,以免误导读者,给解决此类问题带来不必要的麻烦。本篇是在用.netcoe3.1配置使用swagger的过程中,出现此类问题,请结合实际场景,进行调整。

场景介绍:

我是在使用.netcore3.1来构建一个webapi项目,提供的都是接口,因此,采用swagger来生成接口文档。目前使用的是5.6。

web服务器使用的nginx。

出现的问题:

正式发布后,时不时发生文档swagger/index.html打不开的情况,甚是奇怪。系统刚部署,就接到APP的反馈,接口文档打不开等问题,换了几个浏览器依然如此。后来百度和bing查了相关的问题,排在前面的是nginx配置问题,怀疑有这种可能,于是修改了nginx权限配置,结果依然无济于事。后,我又测试了本地程序,发现依然会出现该类问题。那就排除了nginx的可能。还有一种情况,当我们启动浏览器F12开发者工具时,在禁用缓存的情况下,接口文档地址一直返回空白。

在不禁用缓存的情况下,多次刷新,偶尔会出现正常。查看网络请求,发现多是css、js、json等这些问题,反回时好时坏,如: swagger.json 文件,

而且返回的content-length长度不一。大多是,65kb的样子。查看日志,程序也出现了错误,而且是Kestrel内部抛出这样的异常,查看Kestrel相关的资料,

发现MaxResponseBufferSize最大默认65,536,这与异常中的65,536不谋而合,纯是巧合否。于是修改了关于MaxResponseBufferSize的配置,将其设置为999999等,代码如下:

            Microsoft.Extensions.Configuration.ConfigurationBuilder builder = new ConfigurationBuilder();

            string iniPath = $"{AppDomain.CurrentDomain.BaseDirectory}Config/Api.ini";//配置文件
            IConfiguration iniConfiguration = builder.AddIniFile(iniPath).Build();

            var host = Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>()
                          .UseContentRoot(AppDomain.CurrentDomain.BaseDirectory)
                          .UseUrls("http://*:5000")
                          .UseConfiguration(iniConfiguration)
                          .UseIISIntegration()
                          .ConfigureKestrel((options) =>
                           {
                               options.AllowSynchronousIO = false;
                               options.Limits.MaxResponseBufferSize = 999999;

                           });
            })
            .UseServiceProviderFactory(new AutofacServiceProviderFactory())
            .Build();
System.InvalidOperationException: Response Content-Length mismatch: too few bytes written (65,536 of 965210

结果,依然无济于事,本以为是配置不对,各种方式,结果相同。后又怀疑是否是swagger版本存在这样的问题,baidu和bing查了相关的资料,很少。试一试吧,于是升级了swagger版本,升级至5.4 、5.5、5.6,甚至降级,5.0、4.X等,依然无济于事。还有类似这样的错误:

Parse error and missing valid Swagger or OpenAPI version field 

看到这,还以为是版本号的问题,调整后仍无济于事。

后来突然想到,.netcore中间件的问题,.netcore中间件的线性组合,可能跟传递执行顺序有关,于是调整AddSwaggerGen的顺序,结果一切正常。所以,在.netcore中,尤其是中间件,顺序很重要。 

 

 

 

展开阅读全文
加载中

作者的其它热门文章

打赏
0
0 收藏
分享
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部