Global.asax 的 Application_Start 方法未被调用
Global.asax's Application_Start method doesn't get called
我在本地 IIS(不是 Express)上托管了一个 WCF Web 服务。我在它的根目录中包含了一个 Global.asax,它应该在的位置。由于我将 Ninject 与 WCF 扩展一起使用,因此 class 全局扩展 NinjectHttpApplication 而不是 HttpApplication(如 here 所示)。
此外,我正在使用 AutoMapper 库来避免编写无聊的样板代码。
出现问题是因为我为配置 AutoMapper 定义的静态方法没有被调用,导致 AutoMapper 在我调用 Mapper.Map() 时抛出异常。该静态方法的调用在 Global.asax 的 Application_Start() 方法中定义,因为我希望这些映射在每个 Web 服务的生命周期中执行一次。
顺便说一句,Ninject 的 CreateKernel() 方法被调用得很好。
我在这里错过了什么吗?我试过调试它,即使我将调试器附加到 w3wp.exe 并尝试在它的主体中放置一个显式的 Debugger.Break() 调用,它也没有到达断点。
到目前为止是这样的:
Global.asax
<%@ Application Codebehind="Global.asax.cs" Inherits="MyApp.WebHost.Global" Language="C#" %>
Global.asax.cs
public class Global : NinjectHttpApplication
{
protected override IKernel CreateKernel()
{
IKernel kernel = new StandardKernel();
/* various bindings */
return kernel;
}
protected void Application_Start(object sender, EventArgs e)
{
AutoMapperConfig.RegisterMappings();
}
/* rest of Global.asax methods (Session_Start, Application_BeginRequest, etc.) with empty bodies */
RegisterMappings 方法
public static class AutoMapperConfig
{
public static void RegisterMappings()
{
/* multiple calls to Mapper.CreateMap() */
Mapper.AssertConfigurationIsValid();
}
}
Svc 文件标记
<%@ ServiceHost Language="C#"
Debug="true"
Service="MyApp.Services.MyAppService"
Factory="Ninject.Extensions.Wcf.NinjectServiceHostFactory" %>
其他一切正常,我已经创建了一个测试客户端(一个简单的控制台应用程序)并添加了一个服务引用。服务方法被调用得很好,只是这些映射有点问题,因为 AutoMapper 出于显而易见的原因不断抛出 AutoMapperMappingException 异常 ("Missing type map configuration or unsupported mapping.")。
应用程序的应用程序池是 DefaultAppPool。我应该单独创建一个吗?
我真的不明白这里的问题。提前谢谢你。
好吧,它需要一些额外的搜索,但我在这里找到了答案 - https://groups.google.com/forum/#!topic/ninject/wRy3ELSV4bU
问题是 NinjectHttpApplication class 本身实现了 Application_Startup 方法,因此不可能在您自己派生的 class 中实现它(全局 class).
要模拟这种行为,需要覆盖 OnApplicationStarted Ninject 的方法。
这是关于我的特定问题的样子:
protected override void OnApplicationStarted()
{
AutoMapperConfig.RegisterMappings();
}
我在本地 IIS(不是 Express)上托管了一个 WCF Web 服务。我在它的根目录中包含了一个 Global.asax,它应该在的位置。由于我将 Ninject 与 WCF 扩展一起使用,因此 class 全局扩展 NinjectHttpApplication 而不是 HttpApplication(如 here 所示)。 此外,我正在使用 AutoMapper 库来避免编写无聊的样板代码。 出现问题是因为我为配置 AutoMapper 定义的静态方法没有被调用,导致 AutoMapper 在我调用 Mapper.Map() 时抛出异常。该静态方法的调用在 Global.asax 的 Application_Start() 方法中定义,因为我希望这些映射在每个 Web 服务的生命周期中执行一次。 顺便说一句,Ninject 的 CreateKernel() 方法被调用得很好。 我在这里错过了什么吗?我试过调试它,即使我将调试器附加到 w3wp.exe 并尝试在它的主体中放置一个显式的 Debugger.Break() 调用,它也没有到达断点。
到目前为止是这样的:
Global.asax
<%@ Application Codebehind="Global.asax.cs" Inherits="MyApp.WebHost.Global" Language="C#" %>
Global.asax.cs
public class Global : NinjectHttpApplication
{
protected override IKernel CreateKernel()
{
IKernel kernel = new StandardKernel();
/* various bindings */
return kernel;
}
protected void Application_Start(object sender, EventArgs e)
{
AutoMapperConfig.RegisterMappings();
}
/* rest of Global.asax methods (Session_Start, Application_BeginRequest, etc.) with empty bodies */
RegisterMappings 方法
public static class AutoMapperConfig
{
public static void RegisterMappings()
{
/* multiple calls to Mapper.CreateMap() */
Mapper.AssertConfigurationIsValid();
}
}
Svc 文件标记
<%@ ServiceHost Language="C#"
Debug="true"
Service="MyApp.Services.MyAppService"
Factory="Ninject.Extensions.Wcf.NinjectServiceHostFactory" %>
其他一切正常,我已经创建了一个测试客户端(一个简单的控制台应用程序)并添加了一个服务引用。服务方法被调用得很好,只是这些映射有点问题,因为 AutoMapper 出于显而易见的原因不断抛出 AutoMapperMappingException 异常 ("Missing type map configuration or unsupported mapping.")。 应用程序的应用程序池是 DefaultAppPool。我应该单独创建一个吗?
我真的不明白这里的问题。提前谢谢你。
好吧,它需要一些额外的搜索,但我在这里找到了答案 - https://groups.google.com/forum/#!topic/ninject/wRy3ELSV4bU
问题是 NinjectHttpApplication class 本身实现了 Application_Startup 方法,因此不可能在您自己派生的 class 中实现它(全局 class). 要模拟这种行为,需要覆盖 OnApplicationStarted Ninject 的方法。 这是关于我的特定问题的样子:
protected override void OnApplicationStarted()
{
AutoMapperConfig.RegisterMappings();
}