ASP.NET webAPI事件混淆命中一个不存在的路由

时间:2015-06-26 04:23:49

标签: c# asp.net asp.net-web-api

我有一个简单的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重复触发预期的行为?

UPDATE:

我发现这个问题(BeginRequest被调用两次)只发生在基于属性的路由上。当我使用传统的路由方法时,它不会发生:

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}"
            );

我不能禁止使用基于属性的路由,因此仍需要解决问题。有什么指针吗?

1 个答案:

答案 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;
    }
}