首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >ASP.NET MVC 4拦截所有传入的请求

ASP.NET MVC 4拦截所有传入的请求
EN

Stack Overflow用户
提问于 2012-07-31 01:51:35
回答 4查看 69.5K关注 0票数 79

有没有办法捕获所有对我的ASP.NET MVC4应用程序的传入请求,并在继续将请求转发到指定的控制器/操作之前运行一些代码?

我需要使用现有的服务运行一些自定义的身份验证代码,为了正确地做到这一点,我需要能够拦截来自所有客户端的所有传入请求,以仔细检查其他服务的某些内容。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-07-31 01:54:22

最正确的方法是创建一个继承ActionFilterAttribute并覆盖OnActionExecuting方法的类。然后可以在Global.asax.csGlobalFilters中进行注册

当然,这将只拦截实际具有路由的请求。

票数 81
EN

Stack Overflow用户

发布于 2012-07-31 01:57:54

您可以使用HttpModule来完成此任务。以下是我用来计算所有请求的处理时间的示例:

代码语言:javascript
复制
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中注册模块的方式:

代码语言:javascript
复制
<system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
        <add name="PerformanceMonitorModule" type="Sample.HttpModules.PerformanceMonitorModule" />
    </modules>
<//system.webServer>
票数 38
EN

Stack Overflow用户

发布于 2013-12-10 16:44:11

我认为你搜索的是这样的:

代码语言:javascript
复制
Application_BeginRequest()

http://www.dotnetcurry.com/showarticle.aspx?ID=126

你把它放到Global.asax.cs里。

代码语言:javascript
复制
    protected void Application_BeginRequest(object sender, EventArgs e)
    {
        HttpContext.Current.Request.....;
    }

我将其用于调试目的,但我不确定它对您的情况有多好。

票数 25
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11726848

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档