您的位置:首页 > 编程语言 > ASP

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

2015-06-10 09:44 405 查看
问题:

当自定义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对象丢失的原因,有结果我会在后续的文章中给出。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: