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}"
            );

我不能禁止使用基于属性的路由,所以仍然需要解决这个问题。有指针吗?

ASP.NET webAPI事件在命中不存在的路由时发生混淆

以下是我最终解决的问题,即响应状态代码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;
    }
}