使用Autofac在IIS上进行WebApi REST服务,首次调用时出错

时间:2016-04-12 08:34:44

标签: c# rest asp.net-web-api autofac

我在IIS上托管的WebAPI项目遇到问题,该项目提供REST API。 该项目使用Autofac来负责创建控制器。这很好,没有问题。 但是,在调用REST API一段时间后(相当长,难以计时)服务器返回错误。当再次进行相同的呼叫时,一切都恢复正常。 经过研究,我注意到Autofac无法创建导致500错误的实例(因此也是最终用户的错误消息)。

这是从服务器返回的错误消息(表示autofac无法创建实例。

  

尝试创建“TranslationController”类型的控制器时发生错误。确保控制器具有无参数的公共构造函数。

at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType) 
at System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage request) 
at System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsyncCore(HttpRequestMessage request, CancellationToken cancellationToken) 
at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__0.MoveNext()

使用Autofac的WebApi扩展程序并且可以正常工作(第一次加载除外)。

这是注册控制器的模块:

public class WebApiIntegrationModule : Autofac.Module
{
    protected override void Load(ContainerBuilder builder)
    {
        builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
        builder.RegisterWebApiFilterProvider(GlobalConfiguration.Configuration);
    }
}

控制器使用的所有依赖项都在同一个程序集中,因此不需要其他程序集来实例化控制器。

除第一次加载外,服务实际上没有问题。 我一直在寻找答案,但我没有找到任何答案。我希望有人知道从哪里开始寻找? 这肯定要与IIS中服务的初始加载有关,但我看不出有什么问题。我错过了什么?

1 个答案:

答案 0 :(得分:2)

我实际上是通过在IIS下更改应用程序池的StartMode来解决此问题。它现在设置为“AlwaysRunning”,因此初始加载问题已经消失。 我不确定是否有更好的选择,但我确实可以使用这个(保持它运行不是这类应用程序的问题)。

StartMode

希望这有助于其他人!

<强>更新

似乎此属性的UI设置仅在IIS 8及更高版本中可用,IIS 7.5(Windows 2008 R2)在UI中不显示此属性,尽管它已存在。

要在这些版本上更新它,您可以使用此命令(在CMD中运行)

%windir%\system32\inetsrv\appcmd set apppool "AppPoolName" -startMode:AlwaysRunning

其中AppPoolName是应用程序池的名称。

请注意,这也适用于较新版本。 创建此命令的bat文件应为所有版本(支持它)设置此属性。