【问题标题】:OWIN Web Api - responses suddenly return 404 on requests that recently returned 200OWIN Web Api - 对于最近返回 200 的请求,响应突然返回 404
【发布时间】:2018-08-19 13:52:55
【问题描述】:

我用一些更相关的信息编辑了我的问题。

我有一个托管在IIS 上的Owin Web-Api 网站。

该应用程序有一个带有 2 个操作的控制器。
该应用程序运行良好。所有操作都返回有效结果。

当应用程序池被回收时,应用程序开始返回 404。 只有重建 bin 目录(我目前在本地工作)才能恢复应用程序(应用程序池上的 stop\start 不会做任何积极的事情)。

这就是我的 Startup.cs 的样子:

var httpConfiguration = new HttpConfiguration();
WebApiConfiguration.Register(httpConfiguration); // will show it's content later

appBuilder.UseRequestScopeContext(); // Third party OwinRequestScopeContext
appBuilder.Use<IOCContainerMiddleware>(); // Custom middleware that creates an IOC container per request and disposes it at the end of the request

appBuilder.UseWebApi(httpConfiguration);

WebApiConfiguration.Register

config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "{controller}/{action}",
constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Post) },
defaults: null);

ConfigureDependencyResolver(config); // Custom dependency resolver that uses the IOC container from above

【问题讨论】:

  • 请向我们显示工作和不工作请求的 URL。
  • @mjwills - 这是完全相同的请求(网址、标头、正文)。这就是为什么它让我发疯..
  • 我猜,您在 IIS 中托管您的应用程序。应用程序被 IIS 回收后是否会出现这种情况(检查回收设置)?
  • 你怎么知道应用程序没有突然关闭?可能存在空闲超时或应用程序崩溃。尝试在启动方法的开头添加显式日志并检查您是否只有一个启动事件。此外,请检查 Windows 事件日志以了解相关的错误事件。如果您一直调用您的应用程序,假设每 30 秒一次,您是否有相同的行为?
  • @SergeyL - 关于回收,我检查了事件日志。关于添加日志,这就是我现在正在做的在全局和中间件之间添加它们。当应用程序工作时,它可以流畅地服务请求。然后我停止向它发送请求几分钟,在接下来的请求中,我收到 404 响应,直到重建应用程序(我在本地工作)。

标签: c# iis asp.net-web-api owin


【解决方案1】:

我发现了问题。

我的 Startup 类位于一个外部 dll 上,该 dll 被我的应用程序引用(并且存在于我的 bin 文件夹中)。

我在 web.config 中的 appSettings 部分中添加了 "owin:appStartup" 键:

<appSettings>
    <add key="owin:appStartup" value="WebApiServicePrototype.Startup.ServiceStartup, WebApiServicePrototype" />
</appSettings>

owin:appStartup 键指向一个外部 dll 时,它可以工作,直到应用程序的应用程序池被回收(我在 IIS 上托管),然后开始抛出 404 结果。

owin:appStartup 指向当前应用程序的 dll 中存在的 Startup 类时,一切正常。

所以现在,我在应用程序的 dll 上创建了一个虚拟适配器,并分配 owin:appStartup 指向它。

我不确定这是否是设计使然。

【讨论】:

  • 为避免将来出现此类问题(由移动或重命名您的启动类引起),我建议使用Startup class detection via OwinStartup Attribute
  • 但是启动类由多个服务共享,因此位于外部程序集中。对我来说,这似乎是一个错误。
猜你喜欢
  • 2022-01-25
  • 2015-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-04
  • 1970-01-01
相关资源
最近更新 更多