首页 文章

当不匹配路线时,OWIN 中的 WebApi 总是返回 200 而不是 404

提问于
浏览
5

我有一个相对简单的 WebApi 站点,带有几个控制器,在 OWIN 中运行,AutoFac 作为 DI 容器。

该站点仅使用属性路由设置,但即使我们遇到无效路由,也始终返回 200 OK 响应。我们还运行了一些过滤器和静态文件服务器,但我已经注释掉了启动文件中的所有代码(所有 IAppBuilder 调用甚至是 HttpConfiguration 的创建),但我们仍然会遇到这种情况。这在 IIS 和 IIS Express 中都会发生。

我也试过添加一个默认路由,但看到了相同的行为。

我已经完成了一些阅读,我明白我可以在管道中编写某种钩子,或者编写一个带有 catch 所有路径的控制器和一个返回 404 的动作,但感觉好像不应该这样。

这是默认行为吗?

我看过这个答案,但我们没有 global.asax:ASP.NET Web Api 在返回 404 时返回 200 OK

请参阅下面的简化代码仍然可以证明此问题

Startup.cs

[assembly: OwinStartup(typeof(Startup))]
namespace Api.blah
{
    using Owin;

    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            var config = new HttpConfiguration();

            var container = this.GetAutofacContainer(config);
            config.DependencyResolver = new AutofacWebApiDependencyResolver(container);

            config.MapHttpAttributeRoutes();

            app.UseWebApi(config);
        }

        private IContainer GetAutofacContainer(HttpConfiguration config)
        {
            ContainerBuilder containerBuilder = new ContainerBuilder();

            containerBuilder.RegisterApiControllers(Assembly.GetExecutingAssembly());

            return containerBuilder.Build();
        }
    }

}

HealthController.cs

namespace Api.blah.Controller
{
    [RoutePrefix("api/health")]    
    public class HealthController : ApiController
    {
        public HealthController()
        {

        }

        [HttpGet]
        [Route]
        public HealthResponse Get()
        {
            return new HealthResponse { Alive = true, Healthy = true };
        }
    }
}

如果我访问 api/health 路径以外的任何东西(例如http://localhost:1333/zz),那么我得到 200.原始代码比这大,但我已经大大减少了它,如上所述,同样的行为仍然存在

1 回答

  • 0

    如果 web.config 包含 StaticFileModule,则会发生此问题

    <handlers>
        <!-- Remove all handlers -->
        <clear />
        <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
        <add name="StaticFile" path="*" verb="*" modules="StaticFileModule" resourceType="Unspecified" requireAccess="Read" />
    </handlers>
    

    如果您需要静态文件,可以使用以下路径解决此问题:

    <add name="StaticFile" path="/staticfiles" verb="*" modules="StaticFileModule" resourceType="Unspecified" requireAccess="Read" />
    

相关问题