为什么我的静态构造函数在Azure Web角色中调用了两次?

时间:2012-11-28 15:31:20

标签: azure azure-web-roles

我正在尝试初始化在Azure Web角色中运行的WCF服务的依赖项注册,但我发现了一种非常不寻常的行为,即我的类的静态构造函数被调用了两次。

这是我用作应用程序依赖项的注册表的Dependencies类。

public static class Dependencies
{
    private static IUnityContainer container;

    static Dependencies()
    {
        Dependencies.container = new UnityContainer();
    }

    public static IUnityContainer Container
    {
        get
        {
            ...
        }

        set
        {
            ...
        }
    }

    public static void ConfigureContainer()
    {
        var container = new UnityContainer();

        // Configure container.

        Dependencies.container = container;
    }
}

RoleEntryPoint.OnStart()的重载中,我调用静态ConfigureContainer方法来设置容器,并注册了我的依赖项:

public override bool OnStart()
{
    // Configure container for dependency resolution.
    Dependencies.ConfigureContainer();

    return base.OnStart();
}

我的期望是Dependencies类的静态成员应该由此代码初始化,并且可供应用程序的组件使用。

我所看到的(使用断点和VS2012调试器)是Dependencies的静态构造函数被调用两次:一次在应用程序的原始初始化期间,再次在第一次请求服务。后续请求不会调用静态构造函数(如预期的那样)。

我很想听到解释为什么运行时的行为方式和我应该做的事情,而不是生成我的静态依赖注册表。

2 个答案:

答案 0 :(得分:4)

这可能是因为当您在完整IS中托管Web角色时,RoleEntryPoint代码和其他Web应用程序在不同的AppDomain中运行。

http://blogs.msdn.com/b/windowsazure/archive/2010/12/02/new-full-iis-capabilities-differences-from-hosted-web-core.aspx

答案 1 :(得分:1)

默认情况下,您在Web角色中使用“完整IIS”模式,您将获得两个进程 - 用于处理HTTP请求的IIS工作进程和用于运行RoleEntryPoint后代代码的角色工作进程。根据代码的设计方式,最终可能会在两个进程中使用该静态构造函数,然后调用它两次。