如何调用OwinStartup属性引用的类
本文关键字:属性 引用 OwinStartup 何调用 调用 | 更新日期: 2023-09-27 18:20:12
在为OWIN添加nuget包之后,如果添加属性:
[assembly: OwinStartup(typeof(MyProject.Startup))]
然后类MyProject.Startup的方法
public void Configuration(IAppBuilder app)
接到电话。这是怎么叫的?web.config中对OWIN的唯一引用是程序集绑定重定向。在我的项目中,没有其他对http模块的引用会导致该属性被识别。如果我查看堆栈跟踪,我会看到以下行:
Microsoft.Owin.Host.SystemWeb.dll!Microsoft.Owin.Host.SystemWeb.OwinHttpModule.Init(System.Web.HttpApplication context) Unknown
System.Web.dll!System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(System.IntPtr appContext, System.Web.HttpContext context, System.Reflection.MethodInfo[] handlers) Unknown
这表明OWIN已注册为IIS的事件订阅,但这是如何发生的呢?这是不是硬烘焙到了它寻找程序集引用的框架中?
ASP.NET 4引入了PreApplicationStartMethodAttribute类。此功能的主要用途是启用由于为时已晚而无法在Application_Start中完成的任务。例如,注册生成提供程序和添加程序集引用。因此,该属性允许在应用程序启动时,甚至在application_Start之前,在ASP.NET管道中提前运行代码。
这个属性的用途是:
[assembly: PreApplicationStartMethod(typeof(SomeClassLib.Initializer), "Initialize")]
第一个参数是类型,第二个参数是方法。该方法将是没有参数的公共静态void方法,如下面的代码:
public static class Initializer
{
public static void Initialize() {
// Whatever can we do here?
}
}
Katana源代码使用PreApplicationStartMethod挂接应用程序启动:
[assembly: PreApplicationStartMethod(typeof(PreApplicationStart), "Initialize")]
这表示将调用PreApplicationStart
:中的Initialize()
方法
public static class PreApplicationStart
{
private const string TraceName = "Microsoft.Owin.Host.SystemWeb.PreApplicationStart";
/// <summary>
/// Registers the OWIN request processing module.
/// </summary>
public static void Initialize()
{
try
{
if (OwinBuilder.IsAutomaticAppStartupEnabled)
{
HttpApplication.RegisterModule(typeof(OwinHttpModule));
}
}
catch (Exception exception1)
{
Exception exception = exception1;
ITrace trace = TraceFactory.Create("Microsoft.Owin.Host.SystemWeb.PreApplicationStart");
trace.WriteError(Resources.Trace_RegisterModuleException, exception);
throw;
}
}
}
在线
HttpApplication.RegisterModule(typeof(OwinHttpModule));
OwinHttpModule接管并进入OwinBuilder和OwinAppContext流,后者在程序集中查找Startup类以调用Configuration方法。