c# - IIS 上使用 Autofac 的 WebApi REST 服务,首次调用时出错

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

我在 IIS 上托管的、提供 REST API 的 WebAPI 项目上遇到问题。 该项目使用 Autofac 来负责创建 Controller 。这工作正常并且没有任何问题。 但是,经过一定时间(相当长,很难计时)后,当调用 REST API 时,服务器会返回错误。当再次执行相同的调用时,一切都会恢复正常。 经过研究,我注意到 Autofac 无法创建导致 500 错误的实例(从而向最终用户显示错误消息)。

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

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

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 扩展已使用且有效(首次加载除外)。

这是注册 Controller 的模块:

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

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

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

最佳答案

我实际上通过更改 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 文件应该为所有版本(支持它)设置此属性。

关于c# - IIS 上使用 Autofac 的 WebApi REST 服务,首次调用时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36567754/

相关文章:

c# - 从 Silverlight 调用 REST 服务

.Net - 使用 HttpClient 发布文件?

c# - Windows 8 XAML 对象和快照 View

c# - 从事件中删除重复的委托(delegate)

javascript - TFS 2015 REST API 身份验证

python - 从第 3 方 REST API 构建的 Django 网站内容

c# - 对 asp.net web api 进行 Restful 调用

asp.net-mvc-4 - 为什么在我的 API Controller 完成其请求后会收到 Ninject InvalidOperation 异常?

c# - 从 MongoDB 查询嵌套对象(第 2 部分)

c# - 使用 Unity IoC 进行 MVC 集成测试