OWIN 中的 WebApi 在不匹配路由时始终返回 200 而不是 404



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

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

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

我已经做了一些阅读,我知道我可以将某种钩子写入管道或编写一个具有 catch all 路由和返回 404 的操作的控制器,但感觉

好像没有必要。

这是否是默认行为?

我已经看过这个答案,但我们没有 global.asax:ASP.NET Web API 返回 200 OK,而它应该返回 404

请参阅下面的简化代码,该代码仍然演示了该问题

启动.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();
        }
    }
}

运行状况控制器.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/健康路线以外的任何内容(例如 http://localhost:1333/zz),那么我会得到 200。原始代码比这大,但正如我上面解释的那样,我已经显着减少了它,并且相同的行为仍然存在

如果您的 web.config 包含静态文件模块,则可能会发生此问题

<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" />

最新更新