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也无法进一步了解该问题。

vNext中间件抛出“;无法为类型';找到合适的构造函数;XXX'";错误

我能够通过以下步骤了解如何让Visual Studio进入MS框架代码:

  1. 转到Debug -> Exception Settings
  2. 展开Common Language Runtime Exceptions并检查InvalidOperationException
  3. 按照这篇关于如何调试框架代码的文章进行操作。(非常酷的2015功能(
  4. 在上面的文章中,不要将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">
}
}

  1. 接下来,在你的项目上启动调试器,它不仅应该编译你的项目,还应该编译你从github下载的任何MS框架源代码,从而生成必要的framework.pdb,让你可以突破你在步骤2中感兴趣的异常

通过ActivatorUtilities.CreateInstance代码库,我可以看到问题。我的扩展方法中的复制/粘贴失败。我在Action<>ConfigureOptions参数中使用了MyMiddleware。将它们更改为MyOptions修复了它。