我有一个asp.net Web应用程序,在调用登录页面之前执行一些许可证检查...如果产品未获得许可,那么它会导航到带有一些错误详细信息的abc.aspx页面。此许可证检查是一个HttpModule,它通过web.config配置。
我有一个用于上下文身份验证的事件处理程序。每当调用abc.aspx页面时,都会多次触发此事件,并且页面加载永远不会发生。
在Init上,我使用此代码添加事件处理程序
context.AuthenticateRequest += new EventHandler
当我使用html页面时,似乎没有出现此问题。即使我使用其他一些aspx页面,例如xyz.aspx ...
,问题仍然存在如何停止此身份验证n次。我试过HttpContext.Current.Response.End(),它停止了无限次调用,但是没有加载页面,页面显示为空白。
任何人都对这个问题有任何想法吗?
Global.asax的片段。
<%@ Application Language="C#" Inherits="Microsoft.Practices.CompositeWeb.WebClientApplication" %>
<script runat="server">
private static bool _initializedAlready = false;
private static readonly Object s_lock = new Object();
//fires once on asp.net worker process start
protected override void Application_Start(object sender, EventArgs e)
{
}
protected void Application_BeginRequest(object sender, EventArgs e)
{
if (_initializedAlready)
{
return;
}
lock (s_lock)
{
if (_initializedAlready)
{
return;
}
//custom initialization code
base.Application_Start(sender, e);
_initializedAlready = true;
}
}
public override void Init()
{
base.Init();
//initialize the license module here....
licenseModule.Init(this);
}
</script>
<%@ Application Language="C#" Inherits="Microsoft.Practices.CompositeWeb.WebClientApplication" %>
<script runat="server">
private static bool _initializedAlready = false;
private static readonly Object s_lock = new Object();
//fires once on asp.net worker process start
protected override void Application_Start(object sender, EventArgs e)
{
}
protected void Application_BeginRequest(object sender, EventArgs e)
{
if (_initializedAlready)
{
return;
}
lock (s_lock)
{
if (_initializedAlready)
{
return;
}
//custom initialization code
base.Application_Start(sender, e);
_initializedAlready = true;
}
}
public override void Init()
{
base.Init();
//initialize the license module here....
licenseModule.Init(this);
}
</script>
许可证模块的init()方法
答案 0 :(得分:0)
我认为问题是由于您正在验证abc.aspx。
当您转到某个页面并且许可证检查失败时,它会重定向到abc.aspx。不幸的是,你没有从这个检查中豁免abc.aspx,它会自行检查,然后一次又一次地重定向到自己。
当页面不是“abc.aspx”时,您只能在Init()方法中附加身份验证请求事件。类似的东西:
if(!context.Context.Request.RawUrl.Contains("abc.aspx"))
context.AuthenticateRequest += new EventHandler(context_AuthenticateRequest);
但是,如果您只想在登录页面上执行此操作,那么最好将身份验证检查放在后面的登录页面代码上。