Global.asax的Application_Start方法不会被调用

时间:2015-08-23 14:12:13

标签: wcf ninject automapper global-asax

我的本​​地IIS(不是Express)上托管了WCF Web服务。我在其根目录中包含了一个Global.asax,它应该在那里。由于我使用Ninject和WCF扩展,因此Global类扩展了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异常(“缺少类型映射配置或不支持的映射。”),原因很明显。 应用程序的应用程序池是DefaultAppPool。我应该创建一个单独的吗?

我真的不明白这里的问题。提前谢谢。

1 个答案:

答案 0 :(得分:8)

嗯,它需要一些额外的搜索,但我在这里找到答案 - https://groups.google.com/forum/#!topic/ninject/wRy3ELSV4bU

问题在于NinjectHttpApplication类本身实现了Application_Startup方法,因此无法在您自己的派生类(Global类)中实现它。 要模拟此类行为,需要覆盖OnApplicationStarted Ninject的方法。 这就是我对特定问题的看法:

protected override void OnApplicationStarted()
{
    AutoMapperConfig.RegisterMappings();
}