我有一个简单的ASP.NET webAPI项目,只有一个路由。在httpModule中调用路由时,首先触发BeingRequest,然后按预期触发EndRequest。
然而,当我使用不存在的路径命中API时,我在HttpModule中看到以下行为:
BeginRequest Called --->开始请求被叫---> 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.Current.Response.Status的数据库中,但是由于EndRequest事件被引发两次,我最终得到200状态代码,即使URL \ route是没找到。
有人可以在这里解释这个问题吗?是BeginRequest重复触发预期的行为?
我发现这个问题(BeginRequest被调用两次)只发生在基于属性的路由上。当我使用传统的路由方法时,它不会发生:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}"
);
我不能禁止使用基于属性的路由,因此仍需要解决问题。有什么指针吗?
答案 0 :(得分:0)
这就是我最终要解决的问题,即在调用无效路由的情况下将响应状态代码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;
}
}