ASP.NET C# WebApp中如何为自定义中间件传递命名参数?
问题
在ASP.NET C# WebApp中,自定义了MiddlewareCustomRuntimeExceptionHandler中间件,构造函数代码如下:
public MiddlewareCustomRuntimeExceptionHandler (RequestDelegate next, ILogger<MiddlewareCustomRuntimeExceptionHandler> logger, bool showDeveloperDebugInfo, bool sessionEnabled) { _next = next; _logger = logger; _showDeveloperDebugInfo = showDeveloperDebugInfo; _sessionEnabled = sessionEnabled; }
使用位置参数传递showDeveloperDebugInfo和sessionEnabled时可正常运行:
app.UseMiddleware<MiddlewareCustomRuntimeExceptionHandler>(true, false);
但尝试用命名参数传递这两个参数时,两种写法均失败:
- 写法一无法正常运行:
app.UseMiddleware<MiddlewareCustomRuntimeExceptionHandler>( showDeveloperDebugInfo: true, sessionEnabled: true );
- 写法二报错:
The best overload for 'UseMiddleware' does not have a parameter named 'next':
app.UseMiddleware<MiddlewareCustomRuntimeExceptionHandler>( next: null, Logger: null, showDeveloperDebugInfo: true, sessionEnabled: true );
请问此处能否使用命名参数?正确语法是什么?
环境配置:
- Visual Studio Code: 1.83.1
- .NET SDK版本:7.0.403
- .NET运行时版本:Microsoft.AspNetCore.App 7.0.13、Microsoft.NETCore.App 7.0.13、Microsoft.WindowsDesktop.App 7.0.13
- 系统:Windows 11 22621
解决方案
可以使用命名参数,关键要理解UseMiddleware的参数传递逻辑:
- 构造函数中的
RequestDelegate和ILogger<MiddlewareCustomRuntimeExceptionHandler>是由ASP.NET Core依赖注入容器自动解析注入的,不需要手动传递。 UseMiddleware的参数列表只需要传入构造函数中无法通过DI自动获取的自定义参数(即showDeveloperDebugInfo和sessionEnabled)。
正确命名参数写法
直接指定这两个自定义参数的名称即可,无需处理DI自动注入的参数:
app.UseMiddleware<MiddlewareCustomRuntimeExceptionHandler>( showDeveloperDebugInfo: true, sessionEnabled: true );
写法失败原因分析
- 写法一无法运行:大概率是参数名称不匹配(C#命名参数区分大小写),检查是否和构造函数中的参数名完全一致,比如是否误写为
ShowDeveloperDebugInfo(首字母大写)。另外确保DI容器已正确注册ILogger服务(ASP.NET Core默认已注册)。 - 写法二报错:
UseMiddleware方法本身没有next或logger这类命名参数,你传入的参数最终是映射到构造函数的非DI参数,而非直接对应构造函数的所有参数,因此不能手动指定next或logger参数。
内容的提问来源于stack exchange,提问作者Tapani Talvitie
相关产品推荐
相关产品推荐

