我在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中服务的初始加载有关,但我看不出有什么问题。我错过了什么?
答案 0 :(得分:2)
我实际上是通过在IIS下更改应用程序池的StartMode来解决此问题。它现在设置为“AlwaysRunning”,因此初始加载问题已经消失。 我不确定是否有更好的选择,但我确实可以使用这个(保持它运行不是这类应用程序的问题)。
希望这有助于其他人!
<强>更新强>
似乎此属性的UI设置仅在IIS 8及更高版本中可用,IIS 7.5(Windows 2008 R2)在UI中不显示此属性,尽管它已存在。
要在这些版本上更新它,您可以使用此命令(在CMD中运行)
%windir%\system32\inetsrv\appcmd set apppool "AppPoolName" -startMode:AlwaysRunning
其中AppPoolName是应用程序池的名称。
请注意,这也适用于较新版本。 创建此命令的bat文件应为所有版本(支持它)设置此属性。