OWIN架构下WebApi在路由不匹配时,为何总是输出200状态码而非404错误码?

2026-03-30 11:301阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计567个文字,预计阅读时间需要3分钟。

OWIN架构下WebApi在路由不匹配时,为何总是输出200状态码而非404错误码?

我有一个相对简单的WebApi站点,包含几个控制器,在OWIN中运行,AutoFac作为DI容器。该站点仅使用属性路由设置,但遇到了无效路由,也始终返回200+OK响应。我们还在运行一些过滤器和静态内容。

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

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

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

OWIN架构下WebApi在路由不匹配时,为何总是输出200状态码而非404错误码?

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

这是默认行为吗?

我看过这个答案,但我们没有global.asax:ASP.NET Web Api returns 200 OK when it should return 404

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

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路线以外的任何东西(例如localhost:1333/zz),那么我得到200.
原始代码比这大,但我已经大大减少了它,如上所述,并且相同的行为仍然存在

如果您的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" />

标签:W

本文共计567个文字,预计阅读时间需要3分钟。

OWIN架构下WebApi在路由不匹配时,为何总是输出200状态码而非404错误码?

我有一个相对简单的WebApi站点,包含几个控制器,在OWIN中运行,AutoFac作为DI容器。该站点仅使用属性路由设置,但遇到了无效路由,也始终返回200+OK响应。我们还在运行一些过滤器和静态内容。

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

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

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

OWIN架构下WebApi在路由不匹配时,为何总是输出200状态码而非404错误码?

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

这是默认行为吗?

我看过这个答案,但我们没有global.asax:ASP.NET Web Api returns 200 OK when it should return 404

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

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路线以外的任何东西(例如localhost:1333/zz),那么我得到200.
原始代码比这大,但我已经大大减少了它,如上所述,并且相同的行为仍然存在

如果您的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" />

标签:W