OWA中的WebApi在不匹配路由时总是返回200而不是404

问题描述:

我有一个相对简单的WebApi站点,有几个控制器,在OWIN中以AutoFac作为DI容器运行。OWA中的WebApi在不匹配路由时总是返回200而不是404

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

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

我已经做了一些阅读,并且我明白我可以在管道中编写某种钩子,或者编写一个控制器来捕获所有的路由和一个返回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 }; 
     } 
    } 
} 

如果我访问其他任何东西n中的API /保健途径(例如http://localhost:1333/zz)然后我得到了200元。 原来的代码比这个更大的,但正如我上面所解释的,我显著降低它和相同的行为仍然存在

+0

不,这不是默认的行为。如果您需要任何帮助,您需要发布一些代码。 – Hypnobrew

+0

@Merryweather完成 – ChrisFletcher

+0

只是为了完整性:请添加您的路线配置 – Marco

这个问题可以发生,如果你的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" />