Ensure that HttpConfiguration.EnsureInitialized()

前端 未结 14 1055
一生所求
一生所求 2020-11-30 23:31

I\'ve installed Visual Studio 2013 and when I run my app I get the error below.

I\'ve got no idea as to where I\'m to initialized this object.

What to do?

14条回答
  •  攒了一身酷
    2020-11-30 23:37

    This is old, but is the first result on google when searching for this error. After quite a bit of digging I was able to figure out what was going on.

    tldr:
    All GlobalConfiguration.Configure does is invoke your action and call EnsureInitialized(). config.MapAttributeRoutes() must be called before EnsureInitialized() since EnsureInitialized only runs once.

    Meaning: if you're coming from an existing Mvc project, all you have to do is:

    1. Add GlobalConfiguration.Configuration.EnsureInitialized(); to the bottom of your Application_Start method.

    OR

    1. Move your entire configuration into a single call to GlobalConfiguration.Configure:
    GlobalConfiguration.Configure(config => 
    {
        WebApiConfig.Register(config);
        config.MapAttributeRoutes();
        ...
    });
    

    Digging Deeper

    HttpConfiguration.Configuration has an "Initializer" property defined like this:

    public Action Initializer;
    

    HttpConfiguration.EnsureInitialized() runs this action and sets _initialized to true

    public void EnsureInitialized()
    { 
        if (_initialized)
        {
            return;
        }
        _initialized = true;
        Initializer(this);            
    }
    

    HttpConfiguration.MapAttributeRoutes calls internal method AttributeRoutingMapper.MapAttributeRoutes which sets HttpConfiguration.Initializer

    public static void MapAttributeRoutes(...)
    {
        RouteCollectionRoute aggregateRoute = new RouteCollectionRoute();
        configuration.Routes.Add(AttributeRouteName, aggregateRoute);
    
        ...
    
        Action previousInitializer = configuration.Initializer;
        configuration.Initializer = config =>
        {
            previousInitializer(config);
            ...
        };
    }
    

    GlobalConfiguration.Configure runs EnsureInitialized immediately after invoking your action:

    public static void Configure(Action configurationCallback)
    {
        if (configurationCallback == null)
        {
            throw new ArgumentNullException("configurationCallback");
        }
    
        configurationCallback.Invoke(Configuration);
        Configuration.EnsureInitialized();
    }
    

    Don't forget, if you run in to a wall, the source for asp.net is available at http://aspnetwebstack.codeplex.com/SourceControl/latest

提交回复
热议问题