Asp.Net Url重写页面中Session无效

问题:

当自定义HttpModule类来重写Ur时,在Context.RewritePath()实行到真实页面中会话状态Session失效。用微软最新urlrewriter2时没有出现这样的问题

(说明:下面的HttpModuler重写规则我没有写的很复杂,这里只是为了说明问题简单写的,实际可运用正则表达式来匹配原路径和目标路径)


报错:


界面:


源码:

ConvertHtmlHttpModule:

public class ConvertHtmlHttpModule : IHttpModule
    {
        public ConvertHtmlHttpModule()
        {
            //
            // TODO: 在此处添加构造函数逻辑
            //
        }

        public void Dispose()
        {
            //throw new NotImplementedException();
        }

        public void Init(HttpApplication context)
        {
            context.BeginRequest += new EventHandler(BeginRequest);
        }
        private void BeginRequest(object sender, EventArgs e)
        {
            HttpApplication httpApplication = (HttpApplication)sender;
            HttpContext context = httpApplication.Context;
            string pathStr = context.Request.Url.AbsolutePath;
            if (!File.Exists(context.Server.MapPath(pathStr))&&pathStr.IndexOf(".html")>0)
            {
                context.RewritePath(pathStr.Replace("html", "aspx"));
            }
        }      
    }


SelfTextBoxControlTest.cs:

 public partial class SelfTextBoxControlTest : System.Web.UI.Page
    {             
        protected void Page_Load(object sender, EventArgs e)
        {

        }
        protected override void Render(HtmlTextWriter writer)
        {
            //重写writer,修改action属性值
            writer = new FromHtmlTextWriter(writer.InnerWriter);
            base.Render(writer);
        }
        protected void btnCheckCode_Click(object sender, EventArgs e)
        {
            if (txtCode.Text.Trim() != Session["CheckCode"].ToString())
                ClientScript.RegisterClientScriptBlock(GetType(), Guid.NewGuid().ToString(), "alert('验证码输入错误!')", true);
        }       
    }
    /// <summary>
    /// 把Form中的action属性改为重写后的url,否则还是提交给aspx页面
    /// </summary>
    public class FromHtmlTextWriter : HtmlTextWriter
    {
        private string _url;
        public FromHtmlTextWriter(TextWriter writer)
            : base(writer)
        {
            _url = HttpContext.Current.Request.RawUrl;
        }
        public override void WriteAttribute(string name, string value, bool fEncode)
        {
            if (name == "action")
                value = _url;
            base.WriteAttribute(name, value,fEncode);
        }
    }

Web.config配置:

<system.webServer>    
    <handlers>
     <add name="GetCheckCode" type="DiyControlWeb.GetCheckCodeHandler" verb="GET" path="GetCheckCode" />
    </handlers>
    <modules>
     <add name="mudule" type="DiyControlWeb.ConvertHtmlHttpModule" /> 
    </modules>
  </system.webServer>


解决方案:

修改Web.config,先删除原有session映射,再添加

<system.webServer>
    <handlers>
      <add name="GetCheckCode" type="DiyControlWeb.GetCheckCodeHandler" verb="GET" path="GetCheckCode" />
    </handlers>
    <modules>
     <add name="mudule" type="DiyControlWeb.ConvertHtmlHttpModule" />      
     <span style="color:#FF0000;"><remove name="Session" />
     <add name="HtmlSession" type="System.Web.SessionState.SessionStateModule" /></span>
    </modules>
  </system.webServer>

我看到一篇文章,说微软的rewriter组件重写Url也会出现session丢失的问题,自己试了下没有问题。至于Session对象丢失的原因,有结果我会在后续的文章中给出。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值