为ASP.NET的每个请求执行一些代码(aspx和cshtml)

时间:2013-03-25 06:51:27

标签: asp.net razor global-asax iis-8

除了使用基页类之外,有没有办法在asp.net 4.5 中为.aspx或.cshtml页面的每个请求编写一些代码。这是一个非常庞大的项目,对所有页面进行更改以使用基页是一场噩梦。此外,我不确定如何为cshtml页面做这件事,因为他们没有班级。

我们可以使用 Application_BeginRequest 并仅定位aspx和cshtml文件,因为网站是以集成模式运行的。?

基本上,我必须检查访问该网站的用户是否具有针对数据库的特定IP地址,如果是,则允许访问,否则重定向。

我们正在使用IIS8和ASP.Net 4.5以及ASP.Net Razor网页

2 个答案:

答案 0 :(得分:1)

  

此外,我不确定如何对cshtml页面进行此操作,因为它们没有类。

您可以放置​​一个_ViewStart.cshtml文件,其内容将在每个请求中执行。

或者你可以写一个custom Http Module

public class MyModule: IHttpModule
{
    public void Init(HttpApplication app)
    {
        app.BeginRequest += new EventHandler(OnBeginRequest);
    }

    public void Dispose()
    { 

    }   

    public void OnBeginRequest(object s, EventArgs e)
    {
        // this code here's gonna get executed on each request
    }
}

然后只需在web.config中注册此模块:

<system.webServer>
    <modules>
        <add name="MyModule" type="SomeNamespace.MyModule, SomeAssembly" />
    </modules>
    ...
</system.webServer>

或者如果您在经典模式下运行:

<system.web>
    <httpModules>
        <add name="MyModule" type="SomeNamespace.MyModule, SomeAssembly" />
    </httpModules>
</system.web>
  

基本上,我必须检查访问该网站的用户是否有   针对数据库的特定IP地址,如果是,则允许访问   否则重定向。

OnBeginRequest方法中,您可以获得当前用户IP:

    public void OnBeginRequest(object sender, EventArgs e)
    {
        var app = sender as HttpApplication;
        var request = app.Context.Request;
        string ip = request.UserHostAddress;
        // do your checks against the database
    }

答案 1 :(得分:1)

Asp.net MVC过滤器专为此目的而设计。

您可以像这样实现ActionFilterAttribute(可能将此新类放在您的webapp解决方案的Filters文件夹中):

public class IpFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        string ip = filterContext.HttpContext.Request.UserHostAddress;

        if(!testIp(ip))
        {
            if (true /* You want to use a route name*/)
                filterContext.Result = new RedirectToRouteResult("badIpRouteName");
            else /* you want an url */
                filterContext.Result = new RedirectResult("~/badIpController/badIpAction");
        }

        base.OnActionExecuting(filterContext);
    }
    private bool testIp(string inputIp)
    {
        return true /* do you ip test here */;
    }
}

然后你必须装饰任何会用IpFilter执行ipcheck的动作,如下所示:

    [IpFilter]
    public ActionResult AnyActionWhichNeedsGoodIp()
    {
         /* do stuff */
    }