2013-03-25 96 views
1

是否有一种方法可以编写一些代码,用于将每个请求执行到.aspx或.cshtml页面的asp.net 4.5 以外使用基页面类。这是一个非常大的项目,并且对所有页面进行更改以使用基本页面是一场噩梦。此外,我不知道这将如何做一个cshtml页面,因为他们没有一个类。为ASP.NET的每个请求(aspx和cshtml)执行一些代码

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

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

我们使用IIS8和ASP.Net 4.5和ASP.Net剃刀网页

回答

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 
    } 
+0

谢谢Darin ...那完美的作品:) – 2013-03-25 08:46:48

1

Asp.net MVC过滤器是专为这一目的。

你会实现ActionFilterAttribute这样的(也许把这个新类的过滤器文件夹在你的web应用程序的解决方案):

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 */ 
    }