ASP.NET webAPI事件在命中不存在的路由时发生混淆
本文关键字:路由 不存在 webAPI NET 事件 ASP | 更新日期: 2023-09-27 18:00:02
我有一个简单的ASP。NET webAPI项目,只有一个路由。在httpModule中调用路由时,首先激发BeingRequest,然后按预期激发EndRequest。
然而,当我使用不存在的路由访问API时,我在我的HttpModule中看到以下行为:
调用了BeginRequest--->开始调用的请求--->EndRequest(响应代码404)--->EndRequest(响应代码200)
下面是HttpModule:
using System;
using System.Web;
public class TestModule : IHttpModule
{
public String ModuleName
{
get { return "TestModule"; }
}
public void Init(HttpApplication application)
{
application.BeginRequest += Application_BeginRequest;
application.EndRequest += Application_EndRequest;
}
private void Application_BeginRequest(Object source,
EventArgs e)
{
HttpApplication application = (HttpApplication)source;
HttpContext context = application.Context;
string filePath = context.Request.FilePath;
}
private void Application_EndRequest(Object source, EventArgs e)
{
HttpApplication application = (HttpApplication)source;
HttpContext context = application.Context;
string filePath = context.Request.FilePath;
}
public void Dispose() { }
}
和我的控制器:
public class SampleController : ApiController
{
[Route("Test")]
[HttpGet]
public IHttpActionResult WriteLog()
{
//omitted code
return Ok(true);
}
}
和我的标准webApiConfig:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
问题是,我将每个请求的响应字段记录到包括HttpContext的数据库中。现在的回答状态,但由于EndRequest事件被引发了两次,即使在没有找到URL''route的地方,我也会得到200状态代码。
有人能在这里解释一下这个问题吗?重复触发BeginRequest是预期行为吗?
更新:
我观察到这个问题(BeginRequest被调用两次)只在基于属性的路由中发生。当我使用传统的路由方法时不会发生这种情况:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}"
);
我不能禁止使用基于属性的路由,所以仍然需要解决这个问题。有指针吗?
以下是我最终解决的问题,即响应状态代码200被写入日志,即使调用了无效路由(404):
private void Application_BeginRequest(object sender, EventArgs eventArgs)
{
if (System.Web.Routing.RouteTable.Routes.GetRouteData(new HttpContextWrapper(HttpContext.Current)) == null)
{
HttpContext.Current.Response.StatusCode = 404;
}
}