作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们有一个 ASP.NET Core 5 应用程序在 AWS 的 Docker 容器中运行。
当它收到一连串的 HTTP POST 请求时,我在日志中收到此错误:
System.IO.IOException: Too many open files
at Interop.ThrowExceptionForIoErrno(ErrorInfo errorInfo, String path, Boolean isDirectory, Func`2 errorRewriter)
at Microsoft.Win32.SafeHandles.SafeFileHandle.Open(String path, OpenFlags flags, Int32 mode)
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options)
at Microsoft.AspNetCore.WebUtilities.FileBufferingReadStream.CreateTempFile()
at Microsoft.AspNetCore.WebUtilities.FileBufferingReadStream.ReadAsync(Memory`1 buffer, CancellationToken cancellationToken)
at System.Text.Json.JsonSerializer.ReadAsync[TValue](Stream utf8Json, Type returnType, JsonSerializerOptions options, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Mvc.Formatters.SystemTextJsonInputFormatter.ReadRequestBodyAsync(InputFormatterContext context, Encoding encoding)
at Microsoft.AspNetCore.Mvc.Formatters.SystemTextJsonInputFormatter.ReadRequestBodyAsync(InputFormatterContext context, Encoding encoding)
at Microsoft.AspNetCore.Mvc.ModelBinding.Binders.BodyModelBinder.BindModelAsync(ModelBindingContext bindingContext)
at Microsoft.AspNetCore.Mvc.ModelBinding.ParameterBinder.BindModelAsync(ActionContext actionContext, IModelBinder modelBinder, IValueProvider valueProvider, ParameterDescriptor parameter, ModelMetadata metadata, Object value, Object container)
at Microsoft.AspNetCore.Mvc.Controllers.ControllerBinderDelegateProvider.<>c_DisplayClass0_0.<<CreateBinderDelegate>g_Bind|0>d.MoveNext()
通过上面的异常跟踪,我们可以看到:
FileBufferingReadStream
发生这种情况时正在尝试在读取输入流时将新文件创建到磁盘(请参阅源代码 here)。当您 enable buffering 时会调用此方法在您的解决方案中。 EnableBuffering
的代码。从我的解决方案。库/框架中是否有任何代码可以从我们这里启用缓冲?这是由一些环境变量控制的,这些环境变量可能是运行环境的一部分?
Program.cs
类(为了隐私我省略了一些东西):
public static async Task Main(string[] args)
{
var webHost = CreateHostBuilder(args).Build();
await webHost.RunAsync();
}
public static IHostBuilder CreateHostBuilder(string[] args)
{
return Host.CreateDefaultBuilder(args)
.ConfigureLogging(logging =>
{
logging.ClearProviders();
logging.AddConsole();
logging.AddDebug();
logging.SetMinimumLevel(LogLevel.Information);
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
webBuilder.CaptureStartupErrors(false);
webBuilder.UseSentry();
})
.ConfigureServices(services => { });
}
这是我的
Startup.cs
类(class):
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
private IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.Configure<Config>(Configuration.GetSection("AppSettings"));
services.AddApiVersioning(version =>
{
version.DefaultApiVersion = new ApiVersion(1, 0);
version.AssumeDefaultVersionWhenUnspecified = true;
version.ReportApiVersions = true;
});
services.AddLogging();
//... DI config here
services.AddControllers();
services.AddHealthChecks();
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo {Title = "MyApp", Version = "v1"});
});
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IMainIndexer elastic)
{
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
endpoints.MapHealthChecks("/healthcheck", new HealthCheckOptions
{
Predicate = _ => true,
ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse
});
endpoints.MapGet("/",
async context =>
{
await context.Response.WriteAsync(
"<html><body>Welcome to MyApp</body></html>");
});
});
}
}
我们尝试了一些变通方法,例如使用不同的 Docker 基础镜像和使用 Newtonsoft 代替
System.Text
我们仍然遇到同样的问题。我错过了什么吗?
最佳答案
如问题中所述,该问题是由启用请求缓冲的中间件中的某些内容引起的。
我们发现这是由 Sentry 引起的.
你可以看到here哨兵调用 EnableBuffering()
.
当我们从 Program.cs
中删除这一行时
WebBuilder.UseSentry();
并再次运行相同的负载,错误消失了。
关于c# - "Too many open files"和请求缓冲,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68096157/
我是一名优秀的程序员,十分优秀!