您的位置:首页 > 理论基础 > 计算机网络

关于HttpModule中像图片,*.css,*.js等资源文件也被请求问题的解决

2010-01-23 21:16 1061 查看
这段时间学习HttpModule,用HttpMoudule写了一个判断权限登录的模块,网上很多,这里不介绍了。我写的代码如下

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;

/// <summary>
///LoginModule 的摘要说明
/// </summary>
public class LoginModule:IHttpModule
{
public LoginModule()
{
//
//TODO: 在此处添加构造函数逻辑
//
}

public string ModuleName
{
get { return "HelloWordModule"; }
}
public void Init(HttpApplication app)
{
app.PreRequestHandlerExecute+=new EventHandler(app_PreRequestHandlerExecute);
}

public void app_PreRequestHandlerExecute(object sender, EventArgs e)
{
HttpApplication app = (HttpApplication)sender;
HttpContext context = app.Context;
string url = context.Request.Url.ToString();
string page = url.Substring(url.ToLower().LastIndexOf("/") + 1);

//检查是否登录
if (context.Session["userId"] == null || context.Session["userId"].ToString().Trim() == "")
{
//如果获取的不是登录页面
if (!page.Equals("logintest"))
{
app.Server.Transfer("logintest.aspx");
}
}

}

public void Dispose()
{

}
}


但出现这样的一个问题,就是像图片,*.css,*.js等文件被请求了,或静态的*.html,导致程序代码出错

(一)可能出现的现象

(1)首次访问测试页面Test.aspx能跳转到Login.aspx页,但是Login.aspx页面中的图片不能加载,并且报js错误(Login页面中有简单的js判断语句),请问各位大大是什么原因造成的啊

(2) if (context.Session["userId"] == null || context.Session["userId"].ToString().Trim() == "") 将出现“未将对象引用设置到对象的实例。” 主要是HttpModule处理.aspx后,还要处理资源文件,第二次执行Session就为空了,如果处理的*.apx页面中没有资源文件,就不会出现第二次请求了。

(3)这也是为什么有人问,好像死循环了,页面被重复执行了,是的,就是因为你页面有资源文件所导致的。

(二)原因

(1)Http模块必须是IIS将请求调度给 aspnet_isapi.dll ISAPI 扩展后才能发挥作用,默认下图片、CSS、JS等请求IIS都是直接返回的,并不给aspnet_isapi.dll处理,Http模块就不会发生作用。

(2)你用iis访问页面就不会过滤图片,js,css 了发布到iis后,图片,css,js就都不会经过httpmodule了,如果你是用vs的 developmentserver 请求 那图片还有css,js会有问题,httpmodule只拦截那些在iis应用程序配置中项关联的后缀文件,像aspx,asmx,ascx

(三)解决办法(参考了下网上的资料)

(1)有上面的原因,可以知道解决的办法,就是发布后,而不是开发环境( developmentserver 请求 )。直接用IIS即可。

(2) HttpModule默认处理aspx页面没有问题,但是如果在IIS上配置html也通过HttpModule处理时会出现死循环无法跳出html页面的问题,在web.config上加上<add verb="*" path= "*.htm" type= "System.Web.StaticFileHandler"/></httpHandlers>

可解决。

个人意见仅供参考,希望给那些跟我碰到一样问题人带来点帮助!请大家指正

参考网址 http://www.cnblogs.com/qiufankaka/archive/2009/09/14/httpmodule.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐