我们对另一个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预加载/应用初始化。我们还启用了preloadEnabled
到true
,然后将applicationInitialization
配置部分添加到web.config
,如下所示:
<system.webServer>
...
<applicationInitialization>
<add initializationPage="login.aspx" />
</applicationInitialization>
...
</system.webServer>
但是,这些变化和变化都没有对WebAPI的行为产生任何影响。我们已经在网上搜索了更多的帮助,但是我们在设置Start Mode
,Start Automatically
,preloadEnabled
方面遇到的所有问题都有点茫然和applicationInitialization
然后它会神奇地起作用,但这绝对不是我们的经验。
有没有人有任何建议或想法?