惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

TaoSecurity Blog
TaoSecurity Blog
Jina AI
Jina AI
雷峰网
雷峰网
月光博客
月光博客
The GitHub Blog
The GitHub Blog
WordPress大学
WordPress大学
B
Blog RSS Feed
美团技术团队
C
CXSECURITY Database RSS Feed - CXSecurity.com
小众软件
小众软件
Security Latest
Security Latest
Microsoft Azure Blog
Microsoft Azure Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
C
Cybersecurity and Infrastructure Security Agency CISA
Last Week in AI
Last Week in AI
A
Arctic Wolf
Latest news
Latest news
Attack and Defense Labs
Attack and Defense Labs
I
Intezer
F
Fortinet All Blogs
罗磊的独立博客
MongoDB | Blog
MongoDB | Blog
Webroot Blog
Webroot Blog
S
Secure Thoughts
Help Net Security
Help Net Security
Apple Machine Learning Research
Apple Machine Learning Research
博客园_首页
V
Visual Studio Blog
P
Proofpoint News Feed
博客园 - 【当耐特】
P
Privacy International News Feed
V
Vulnerabilities – Threatpost
Stack Overflow Blog
Stack Overflow Blog
Know Your Adversary
Know Your Adversary
云风的 BLOG
云风的 BLOG
Hacker News: Ask HN
Hacker News: Ask HN
L
LINUX DO - 最新话题
H
Help Net Security
爱范儿
爱范儿
酷 壳 – CoolShell
酷 壳 – CoolShell
S
SegmentFault 最新的问题
Forbes - Security
Forbes - Security
T
Tailwind CSS Blog
量子位
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
T
Tenable Blog
Cloudbric
Cloudbric
N
News and Events Feed by Topic
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Hugging Face - Blog
Hugging Face - Blog

博客园 - Flymouse

Error CS0006 when invoking MSBuild from command line 一个Cookie引起的混乱 数据库错误:在执行批处理时出现错误。错误消息为: 目录名无效 NorthScale MemBase Server 1.6 的使用 使用网络目录映射虚拟目录出现 500.19 权限不足问题的一个解决办法 调整viewState的位置,有助于SEO C# Excel进程关闭 - Flymouse - 博客园 关于限制水晶报表的导出格式 2个Excel异常处理 Win7 x64 IIS7支持32位应用程序 在.net中与mysql数据库的时候碰到显示不了中文字符的情况实现! 完美解决IFRAME中COOKIE、SESSION丢失 关于Ucenter在IIS中有时出现“Access denied for agent changed”错误。 如何將 Access 的 Memo 型態欄位匯入到 SQL2005 的 nvarchar 型態欄位 .net wap强制输出WML - Flymouse - 博客园 使用Extjs的Form无法输入的问题 jQuery滚屏代码,还有一点地方封装不进去 - Flymouse - 博客园 ASP.NET 2.0 中动态添加 GridView 模板列的例子 关于使用 jquery Validate 使用出现的问题
URL重写给 asp.net Ajax带来的问题
Flymouse · 2010-06-20 · via 博客园 - Flymouse

在使用了URL重写的页面,我们为了保证用户进行PostBack后页面的URL仍然是,我们原先展现给用户的链接,比如是list_1.html而不是list.aspx?page=1

我们需要使用app_browsers目录,存放浏览器定义文件,相关说明可以参考msdn:http://msdn2.microsoft.com/zh-cn/library/ms228122(vs.80).aspx

<!--
可在 <windir>\Microsoft.NET\Framework\<ver>\CONFIG\Browsers 中找到现有的浏览器定义
-->
<browsers>
  <browser refID="Default">
    <controlAdapters>
      <adapter controlType="System.Web.UI.HtmlControls.HtmlForm"
               adapterType="FormRewriterControlAdapter" />
    </controlAdapters>
  </browser>
</browsers>

代码如下:

public class FormRewriterControlAdapter : System.Web.UI.Adapters.ControlAdapter
    {
        protected override void Render(HtmlTextWriter writer)
        {
            if (HttpContext.Current.Request.RawUrl.Contains(".html"))
            {
                base.Render(new RewriteFormHtmlTextWriter(writer));
            }
            else
            {
                base.Render(writer);
            }
        }
    }
    public class RewriteFormHtmlTextWriter : HtmlTextWriter
    {
        public RewriteFormHtmlTextWriter(Html32TextWriter writer)
            : base(writer)
        {
            this.InnerWriter = writer.InnerWriter;
        }

        public RewriteFormHtmlTextWriter(System.IO.TextWriter writer)
            : base(writer)
        {
            this.InnerWriter = writer;
        }

        public override void WriteAttribute(string name, string value, bool fEncode)
        {
            if (name == "action")
            {
                if (HttpContext.Current.Items["ActionAlreadyWritten"] == null)
                {
                    value = HttpContext.Current.Request.RawUrl;
                    HttpContext.Current.Items["ActionAlreadyWritten"] = true;
                }
            }
            base.WriteAttribute(name, value, fEncode);
        }
    }

以上代码一直运行了很长时间,但是后来在使用asp.net Ajax是发现URL重写后的页面会出现错误,重新修改代码,排除Asp.net Ajax请求进行处理,代码如下:

public class FormRewriterControlAdapter : System.Web.UI.Adapters.ControlAdapter
    {
        protected override void Render(HtmlTextWriter writer)
        {
            if (HttpContext.Current.Request.RawUrl.Contains(".html"))
            {
                //取得asp.net Ajax请求标志
                var AsyncPost=HttpContext.Current.Request.Form["__ASYNCPOST"];
                if (AsyncPost=="true") //判断是否asp.net Ajax请求
                {
                    base.Render(writer);
                }
                else
                {
                    base.Render(new RewriteFormHtmlTextWriter(writer));
                }
            }
            else
            {
                base.Render(writer);
            }
        }
    }
    public class RewriteFormHtmlTextWriter : HtmlTextWriter
    {
        public RewriteFormHtmlTextWriter(Html32TextWriter writer)
            : base(writer)
        {
            this.InnerWriter = writer.InnerWriter;
        }

        public RewriteFormHtmlTextWriter(System.IO.TextWriter writer)
            : base(writer)
        {
            this.InnerWriter = writer;
        }

        public override void WriteAttribute(string name, string value, bool fEncode)
        {
            if (name == "action")
            {
                if (HttpContext.Current.Items["ActionAlreadyWritten"] == null)
                {
                    value = HttpContext.Current.Request.RawUrl;
                    HttpContext.Current.Items["ActionAlreadyWritten"] = true;
                }
            }
            base.WriteAttribute(name, value, fEncode);
        }
    }

后又经过调试发现是RewriteFormHtmlTextWriter的构造器有问题,没有包含htmlTextWriter类型的构造器,而使用了TextWriter类型构造器,导致页面结构错误出现null报错。再次调整代码如下:

public class FormRewriterControlAdapter : System.Web.UI.Adapters.ControlAdapter
    {
        protected override void Render(HtmlTextWriter writer)
        {
            if (HttpContext.Current.Request.RawUrl.Contains(".html"))
            {
                //使用过滤掉asp.net Ajax请求的方式避免错误
                //而后发现是RewriteFormHtmlTextWriter的构造器的问题,遂放弃方法
                //var AsyncPost=HttpContext.Current.Request.Form["__ASYNCPOST"];
                //if (AsyncPost=="true")
                //{
                //    base.Render(writer);
                //}
                //else
                //{
                //    base.Render(new RewriteFormHtmlTextWriter(writer));
                //}
                base.Render(new RewriteFormHtmlTextWriter(writer));
            }
            else
            {
                base.Render(writer);
            }
        }


    }
    public class RewriteFormHtmlTextWriter : HtmlTextWriter
    {
        //使用html 4.0方式的渲染器
        public RewriteFormHtmlTextWriter(HtmlTextWriter writer)
            : base(writer)
        {
            this.InnerWriter = writer.InnerWriter;
        }
        //使用html 3.2方式的渲染器,兼容老浏览器
        public RewriteFormHtmlTextWriter(Html32TextWriter writer)
            : base(writer)
        {
            this.InnerWriter = writer.InnerWriter;
        }
        //其他方式浏览器,有可能引起null错误
        public RewriteFormHtmlTextWriter(System.IO.TextWriter writer)
            : base(writer)
        {
            this.InnerWriter = writer;
        }

        public override void WriteAttribute(string name, string value, bool fEncode)
        {

            if (name == "action")
            {
                if (HttpContext.Current.Items["ActionAlreadyWritten"] == null)
                {
                    value = HttpContext.Current.Request.RawUrl;
                    HttpContext.Current.Items["ActionAlreadyWritten"] = true;
                }
            }

            base.WriteAttribute(name, value, fEncode);
        }

    }

关于HtmlTextWriter和Html32TextWriter可以看一下这篇文章 http://www.cnblogs.com/Vegaslee/archive/2007/12/04/982723.html