在继续将请求继续发送到指定的控制器/操作之前,我是否有办法捕获到ASP.NET MVC 4应用程序的所有传入请求并运行一些代码?
我需要使用现有服务运行一些自定义身份验证代码,并且要正确执行此操作,我将需要能够拦截来自所有客户端的所有传入请求,以仔细检查其他服务中的某些内容。
Answers:
最正确的方法是创建一个继承ActionFilterAttribute和重写OnActionExecuting
方法的类。然后可以在GlobalFilters
中注册Global.asax.cs
当然,这只会拦截实际具有路由的请求。
protected void Application_BeginRequest(object sender, EventArgs e)
。
OnActionExecuting
覆盖内强制重定向?
您可以使用HttpModule完成此操作。这是我用来计算所有请求的处理时间的示例:
using System;
using System.Diagnostics;
using System.Web;
namespace Sample.HttpModules
{
public class PerformanceMonitorModule : IHttpModule
{
public void Init(HttpApplication httpApp)
{
httpApp.BeginRequest += OnBeginRequest;
httpApp.EndRequest += OnEndRequest;
httpApp.PreSendRequestHeaders += OnHeaderSent;
}
public void OnHeaderSent(object sender, EventArgs e)
{
var httpApp = (HttpApplication)sender;
httpApp.Context.Items["HeadersSent"] = true;
}
// Record the time of the begin request event.
public void OnBeginRequest(Object sender, EventArgs e)
{
var httpApp = (HttpApplication)sender;
if (httpApp.Request.Path.StartsWith("/media/")) return;
var timer = new Stopwatch();
httpApp.Context.Items["Timer"] = timer;
httpApp.Context.Items["HeadersSent"] = false;
timer.Start();
}
public void OnEndRequest(Object sender, EventArgs e)
{
var httpApp = (HttpApplication)sender;
if (httpApp.Request.Path.StartsWith("/media/")) return;
var timer = (Stopwatch)httpApp.Context.Items["Timer"];
if (timer != null)
{
timer.Stop();
if (!(bool)httpApp.Context.Items["HeadersSent"])
{
httpApp.Context.Response.AppendHeader("ProcessTime",
((double)timer.ElapsedTicks / Stopwatch.Frequency) * 1000 +
" ms.");
}
}
httpApp.Context.Items.Remove("Timer");
httpApp.Context.Items.Remove("HeadersSent");
}
public void Dispose() { /* Not needed */ }
}
}
这是您在Web.Config中注册模块的方式:
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<add name="PerformanceMonitorModule" type="Sample.HttpModules.PerformanceMonitorModule" />
</modules>
<//system.webServer>
runAllManagedModulesForAllRequests
了性能下降。Application_BeginRequest
似乎是获得结果的简单得多的方法
我认为您要搜索的是:
Application_BeginRequest()
http://www.dotnetcurry.com/showarticle.aspx?ID=126
你把它放进去了Global.asax.cs
。
protected void Application_BeginRequest(object sender, EventArgs e)
{
HttpContext.Current.Request.....;
}
我将其用于调试目的,但不确定如何为您的情况解决。
我不确定MVC4,但我认为它与MVC5非常相似。如果您已经创建了一个新的Web项目->查找Global.asax
,您应该FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
在方法中 看到以下行Application_Start()
。
RegisterGlobalFilters
是FilterConfig.cs
位于文件夹中文件中的方法App_Start
。
正如@ YngveB-Nilsen所说,这ActionFilterAttribute
是我认为的方法。添加一个从派生的新类System.Web.Mvc.ActionFilterAttribute
。这很重要,因为System.Web.Http.Filters.ActionFilterAttribute
它将失败,例如以下异常。
给定的筛选器实例必须实现以下筛选器接口中的一个或多个:System.Web.Mvc.IAuthorizationFilter,System.Web.Mvc.IActionFilter,System.Web.Mvc.IResultFilter,System.Web.Mvc.IExceptionFilter,System.Web .Mvc.Filters.IAuthenticationFilter。
将请求写入调试窗口的示例:
public class DebugActionFilter : System.Web.Mvc.ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext actionContext)
{
Debug.WriteLine(actionContext.RequestContext.HttpContext.Request);
}
}
在FilterConfig
-> RegisterGlobalFilters
->中添加以下行:filters.Add(new DebugActionFilter());
。
现在,您可以捕获所有传入的请求并进行修改。