我有一个相对简单的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" />