自动启动承载WebAPI实例的

时间:2016-06-13 22:35:07

标签: asp.net asp.net-web-api ninject

我们对另一个ASP.NET webapp托管的WebAPI应用程序有一个奇怪的问题。 WebAPI控制器都使用Ninject映射,但ASP.NET主机站点不使用Ninject。

问题是任何对任何WebAPI控制器的请求都会因Ninject错误和HTTP 500而失败:

"An error occurred when trying to create a controller of type 'MyObjectsController'. Make sure that the controller has a parameterless public constructor."

但是,即使对主Web应用程序发出单个请求(例如打开登录页面),WebAPI也会按预期调用所有工作。 WebAPI已注册并初始化为Application_Start全局事件的一部分。无论第一个请求是在WebAPI还是webapp下进入,都会触发启动事件,因此在主应用程序之前通过WebAPI时它不会绕过全局启动。 WebAPI注册非常标准:

GlobalConfiguration.Configure(AddressOf WebApiConfig.Register)

注册函数本身并不罕见:

// Web API configuration and services
var cors = new EnableCorsAttribute("*", "*", "*", "X-Pagination");

//To allow cross-origin credentials in Web API
cors.SupportsCredentials = true;
config.EnableCors(cors);

// To disable host-level authentication inside the Web API pipeline and "un-authenticates" the request.
config.SuppressHostPrincipal();
config.Filters.Add(new HostAuthenticationFilter(Startup.OAuthBearerOptions.AuthenticationType));

// Web API routes
var constraintResolver = new DefaultInlineConstraintResolver();
constraintResolver.ConstraintMap.Add("nonzero", typeof(NonZeroConstraint));
//constraintResolver.ConstraintMap.Add("NonEmptyFolderIds", typeof(NonEmptyFolderIdsConstraint));

config.MapHttpAttributeRoutes(constraintResolver);

var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First();
jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();

NinjectConfig也很标准:

public static class NinjectConfig
{
    /// <summary>
    /// THe kernel of Ninject
    /// </summary>
    public static Lazy<IKernel> CreateKernel = new Lazy<IKernel>(() =>
    {
        var kernel = new StandardKernel();
        kernel.Load(Assembly.GetExecutingAssembly());

        RegisterServices(kernel);

        return kernel;
    });

    private static void RegisterServices(KernelBase kernel)
    {
        kernel.Bind<IMyObjectRepository>().To<MyObjectRepository>().InRequestScope();
        ...
    }
}

DI使用的一个例子(同样,非常基本和标准)是:

public class MyObjectRepository : IMyObjectRepository
{
    private readonly IMyOtherObjectRepository _objectRepository;
    ...

    public MyObjectRepository(IMyOtherObjectRepository objectRepository)
    {
        _objectRepository = objectRepository;
        ...  
    }
    ...
}

我们希望在WebAPI可用于请求之前避免对webapp的初始请求的要求,但似乎没有任何东西让我们找到解决方案。

我们最初通过在AppPool配置中将Start Mode设置为AlwaysRunning并将Start automatically设置为True来尝试IIS预加载/应用初始化。我们还启用了preloadEnabledtrue,然后将applicationInitialization配置部分添加到web.config,如下所示:

<system.webServer>
  ...
  <applicationInitialization>
    <add initializationPage="login.aspx" />
  </applicationInitialization>
  ...
</system.webServer>

但是,这些变化和变化都没有对WebAPI的行为产生任何影响。我们已经在网上搜索了更多的帮助,但是我们在设置Start ModeStart AutomaticallypreloadEnabled方面遇到的所有问题都有点茫然和applicationInitialization然后它会神奇地起作用,但这绝对不是我们的经验。

有没有人有任何建议或想法?

1 个答案:

答案 0 :(得分:0)

安装Ninject integration for WebApi nuget包。它创建一个在启动时初始化Ninject的文件。这是doc