Could not load type 'Microsoft.Practices.EnterpriseLibrary.Common.Configuration.ContainerModel.ITypeRegistrationsProvider

ぃ、小莉子 提交于 2019-12-02 03:59:21

TL;DR

Configure the OWIN startup class in your web.config / app.config appSettings like this:

<add key="owin:AppStartup" value="-- your startup class --" />     

The whole story

The problem has to do with the way that OWIN looks for the Startup class. For some strange reason, it finds ITypeRegistrationsProvider and tries to load it.

OWIN has three ways to look for the application startup class:

  • Naming Convention: Katana looks for a class named Startup in namespace matching the assembly name or the global namespace.
  • OwinStartup Attribute: This is the approach most developers will take to specify the startup class. The following attribute will set the startup class to the TestStartup class in the StartupDemo namespace.
  • The appSetting element in the Configuration file <add key="owin:AppStartup" value="..." />

If you look carefully the call stack, you'll see that the problem is related to the second one, looking for the attribute: Owin.Loader.DefaultLoader.SearchForStartupAttribute. For some reason it finds ITypeRegistrationsProvider is suitable as an Startup class, and tries to instance it. Apart from being incorrect, it fails because you cannot instance an interface.

Once you know what the problem is, if you read OWIN source code, in particular OwinBuilder.GetAppStartup, you'll see that the first option to find the startup class is to use the one specified in appSettings:

string appStartup = ConfigurationManager.AppSettings[Constants.OwinAppStartup];

If you specify yous startup class in web.config you'll prevent the application from looking and trying to instance the wrong class. So, to solve the problem, you simply have to specify the app startup class in your web.config or app.config appSettings, like this:

<appSettings>  
  <add key="owin:AppStartup" value="-- your startup class --" />       
</appSettings>

Notes:

  • in the linked document you'll see owin:appStartup, but if you check the source code you'll see that the right syntax is owin:AppStartup (OwinAppStartup constant, as used in the code snippet above)
  • you can specify yous startup class in servera ways, but I recommend you to specify it like this "namespace.ClassName, assemblyName" which is the safest one.

If your configuration is right, I warranty that the Owin loader will take your real startup class, and the error will not happen.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!