vNext中间件抛出“;无法为类型';找到合适的构造函数;XXX'";错误
本文关键字:构造函数 错误 quot XXX 中间件 vNext 类型 | 更新日期: 2023-09-27 17:50:54
试图将一些OWIN中间件转换为vNext,并得到以下错误:
系统。InvalidOperationException:找不到合适的类型"MyMiddleware"的构造函数。确保类型是混凝土的,并且所有参数都是可接受的通过构造函数。在微软框架DependencyInjection。ActivatorUtilities。CreateInstance(IServiceProviderprovider、Type instanceType、Obje ct[]参数(微软AspNet。建设者使用中间件扩展<>c__DisplayClass1_0.b_0(请求代表下一页(。AspNet。建设者ApplicationBuilder。在生成((微软AspNet。主机。主机引擎。EnsureApplicationDelegate(HostingContext上下文(微软AspNet。主机。主机引擎。开始(HostingContext上下文(
在微软。AspNet。主机。程序Main(String[]args(
我不知道如何开始调试这个。我需要知道MS框架试图调用什么排列以及使用什么参数。我如何让它吐出这些信息或设置一个断点?
public class MyMiddleware : AuthenticationMiddleware<MyOptions>
{
public MyMiddleware(RequestDelegate next,
IOptions<MyOptions> options,
ConfigureOptions<MyOptions> configureOptions)
: base(next, options, configureOptions)
{
// doesn't want to call this
}
public MyMiddleware(RequestDelegate next,
IOptions<MyOptions> options,
ConfigureOptions<MyOptions> configureOptions,
IDataProtectionProvider dataProtectionProvider,
ILoggerFactory loggerFactory)
: base(next, options, configureOptions)
{
// doesn't want to call this either and this is the one I'd like to be called
}
}
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddOptions();
services.AddLogging();
services.AddDataProtection();
}
public void Configure(IApplicationBuilder app)
{
app.UseErrorPage();
app.UseMyMiddleware(opts =>
{
});
}
}
public static IApplicationBuilder UseMyMiddleware(this IApplicationBuilder app, Action<MyMiddleware> configureOptions = null, string optionsName = "")
{
return app.UseMiddleware<MyMiddleware>(
new ConfigureOptions<MyMiddleware>(configureOptions ?? (o => { }))
{
Name = optionsName
});
}
我尝试过在构造函数中移动参数,还为AuthenticationMiddleware
类创建了一个具有最小参数集的重载,但也出现了同样的错误。将DNS_TRACE=1设置为1也无法进一步了解该问题。
我能够通过以下步骤了解如何让Visual Studio进入MS框架代码:
- 转到
Debug -> Exception Settings
- 展开
Common Language Runtime Exceptions
并检查InvalidOperationException
- 按照这篇关于如何调试框架代码的文章进行操作。(非常酷的2015功能(
- 在上面的文章中,不要将
sources
设置为源代码的物理位置,而是使用projects
元素。保存global.json
时,VS应刷新解决方案资源管理器,并添加与您的解决方案匹配的任何框架项目。对我来说是Microsoft.Framework.DependencyInjection
&Microsoft.Framework.DependencyInjection.Interface
。以下是我的global.json
的外观:
{
"projects":["src","test","D:/GitHub/DependencyInjection/src"],//注意使用了正斜杠而不是反斜杠,令人失望;(
"源":["程序包"],
"sdk":{
"版本":"1.0.0-beta4">
}
}
- 接下来,在你的项目上启动调试器,它不仅应该编译你的项目,还应该编译你从github下载的任何MS框架源代码,从而生成必要的framework.pdb,让你可以突破你在步骤2中感兴趣的异常
通过ActivatorUtilities.CreateInstance
代码库,我可以看到问题。我的扩展方法中的复制/粘贴失败。我在Action<>
和ConfigureOptions
参数中使用了MyMiddleware
。将它们更改为MyOptions
修复了它。