夜鹰教程网-程序员的加油站
 当前位置:文章中心 >> vs2022_vs2019_vs2017_vs2014_vs2012
.NET重写URL包含form及PostBack处理
夜鹰教程网 来源:www.yyjcw.com 日期:2016-11-1 16:29:04
你的网站-->IIS中处理程序映射-->
添加脚本映射(路径:*.html  可执行文件%windir%/Microsoft.NET/Framework/v2.0.50727/aspnet_isapi.dll  名称:任意,比如Hml )
添加通配符脚本映射(路径:*  可执行文件:C:/Windows/Microsoft.NET/Framework/v2.0.50727/aspnet_isapi.dll  名称:任意,比如All)
托管处理程序映射(路径:*  可执行文件:System.Web.UI.PageHandlerFactory 名称 任意 比如Html-Integrate)-------->
IIS中 模块-->添加---->(名称:任意 如All  类型:URLRewriter.ModuleRewriter 把 仅针对向asp.net 应用程序或托管处理程序发出请求调用  勾上  ok )
-->ok

.NET下URL重写及PostBack处理

URL重写是截取传入Web 请求并自动将请求重定向到其他 URL 的过程。

比如:浏览器发来请求 http://localhost:90/URLRewriter/1.html

服务器自动将这个请求中定向为http://localhost:90/URLRewriter/url.aspx?id=1

URLRewriter下载编译后提取其中的URLRewriter.dll和ActionlessForm.dll

一、URL重写

项目引用URLRewriter.dll

web.config配置:

代码
<?xml version="1.0"?>
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
 
<configSections>
    
<section name="RewriterConfig" type="URLRewriter.Config.RewriterConfigSerializerSectionHandler, URLRewriter" />
  
</configSections>
  
  
<RewriterConfig>
    
<Rules>
      
<RewriterRule>
        
<LookFor>~/URLRewriter/(.[0-9]*)\.html</LookFor>
        
<SendTo>~/URLRewriter/url.aspx?id=$1</SendTo>
      
</RewriterRule>
      
<RewriterRule>
        
<LookFor>~/web</LookFor>
        
<SendTo>~/URLRewriter/url.aspx</SendTo>
      
</RewriterRule>
    
</Rules>
  
</RewriterConfig>
  
  
<system.web>
    
<httpHandlers>
      
<!--URLRewriter begin 使用 HTTP 处理程序执行重写-->
      
<!--<add verb="*" path="*.aspx" type="URLRewriter.RewriterFactoryHandler, URLRewriter" />
      <add verb="*" path="*.html" type="URLRewriter.RewriterFactoryHandler, URLRewriter" />
-->
      
<!--URLRewriter end-->
    
</httpHandlers>
        
    
<httpModules>
      <!--URLRewriter begin 使用 HTTP 模块执行重写 -->
      
<add type="URLRewriter.ModuleRewriter, URLRewriter" name="ModuleRewriter"/>
      
<!--URLRewriter end-->
    
</httpModules>
  
</system.web>
  
</configuration>

 IIS配置:

网站--属性--主目录--配置--插入--C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll

将文件是否存在 勾去掉

二、处理PostBack回发

ActionlessForm.dll以重写Form的方式用于处理PostBack回发后URL变为原始地址

项目引用ActionlessForm.dll在页面中注册一下

<%@ Register TagPrefix="skm" Namespace="ActionlessForm" Assembly="ActionlessForm" %>

将页面中的<form runat="server"></form>替换成:<skm:form id="form1" runat="server"></skm:form>

注:以这种方式处理回发将会在设计器中查看的时候为错误提示Form不可用

所以采用以下方法处理:

在微软的URLRewriter类库中添加以下类之后编译

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

/// <summary>
/// FormRewriter 的摘要说明
/// </summary>
namespace URLRewriter.Form
{
    
public class FormRewriterControlAdapter : System.Web.UI.Adapters.ControlAdapter
    {
        
public FormRewriterControlAdapter()
        {
        }

        
protected override void Render(HtmlTextWriter writer)
        {
            
base.Render(new RewriteFormHtmlTextWriter(writer));
        }
    }

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

        
public override void WriteAttribute(string name, string value, bool fEncode)
        {
            
//If the attribute we are writing is the "action" attribute, and we are not on a sub-control, 
            
//then replace the value to write with the raw URL of the request - which ensures that we'll
            
//preserve the PathInfo value on postback scenarios
            if (name == "action")
            {
                HttpContext context 
= HttpContext.Current;
                
if (context.Items["ActionAlreadyWritten"== null)
                {
                    
//We will use the Request.RawUrl property within ASP.NET to retrieve the origional 
                    
//URL before it was re-written.
                    value = context.Request.RawUrl;
                    
//Indicate that we've already rewritten the <form>'s action attribute to prevent
                    
//us from rewriting a sub-control under the <form> control
                    context.Items["ActionAlreadyWritten"= true;
                }
            }
            
base.WriteAttribute(name, value, fEncode);
        }
    }

}

 在App_Browsers文件夹下创建Form.browser

代码
<browsers>
  
<browser refID="Default">
    
<controlAdapters>
      
<adapter controlType="System.Web.UI.HtmlControls.HtmlForm"
               adapterType
="URLRewriter.Form.FormRewriterControlAdapter" />
    
</controlAdapters>
  
</browser>
</browsers>

这样就不需要引用ActionlessForm.dll也不需要改变Form了,只要引用URLRewriter.dll就可以了

三、在处理重写成html的时候本来网站中的html页面将会不能使用

使用以上方式将不存在找个问题

如果还不行可以在<compilation debug="true">节点下添加

<buildProviders>
        <add extension=".html" type="System.Web.Compilation.PageBuildProvider" />
</buildProviders>

在<httpHandlers>节点下添加(如果之前使用的是http处理程序执行重写的,请写在前面)

<add path="*.html" verb="*" type="System.Web.UI.PageHandlerFactory" validate="true"/>

 

以下为IIS7.0配置方式

暂未测试是否可行

你的网站-->IIS中处理程序映射-->
添加脚本映射(路径:*.html  可执行文件%windir%/Microsoft.NET/Framework/v2.0.50727/aspnet_isapi.dll  名称:任意,比如Hml )
添加通配符脚本映射(路径:*  可执行文件:C:/Windows/Microsoft.NET/Framework/v2.0.50727/aspnet_isapi.dll  名称:任意,比如All)
托管处理程序映射(路径:*  可执行文件:System.Web.UI.PageHandlerFactory 名称 任意 比如Html-Integrate)-------->
IIS中 模块-->添加---->(名称:任意 如All  类型:URLRewriter.ModuleRewriter 把 仅针对向asp.net 应用程序或托管处理程序发出请求调用  勾上  ok )
-->ok
复制链接 网友评论 收藏本文 关闭此页
上一条: Visual Studio 2012究竟有哪些非常…  下一条: .Net教程:Framework4.0中如何实现延迟…
夜鹰教程网成立于2008年,目前已经运营了将近 13 年,发布了大量关于 html5/css3/C#/asp.net/java/python/nodejs/mongodb/sql server/android/javascript/mysql/mvc/easyui/vue/echarts原创教程。 我们一直都在坚持的是:认证负责、一丝不苟、以工匠的精神来打磨每一套教程,让读者感受到作者的用心。我们默默投入的时间,确保每一套教程都是一件作品,而不是呆板的文字和视频! 目前我们推出在线辅导班试运营,模式为一对一辅导,教学工具为QQ。我们的辅导学科包括 java 、android原生开发、webapp开发、商城开发、C#和asp.net开发,winform和物联网开发、web前端开发,但不仅限于此。 普通班针对的是国内学员,例如想打好基础的大学生、想转行的有志青年、想深入学习的程序员、想开发软件的初学者或者业余爱好者等。 就业办针对即将毕业上岗的大四学生,或者打算转行的初级开发工程师。 留学生班针对的是在欧美、加拿大、澳洲、日本、韩国、新加坡等地留学的中国学子,目的是让大家熟练地掌握编程技能,按时完成老师布置的作业,并能顺利地通过考试。 详细咨询QQ:1416759661   夜鹰教程网  基于角色的权限管理系统(c-s/b-s)。
  夜鹰教程网  基于nodejs的聊天室开发视频教程
  夜鹰教程网  Git分布式版本管理视频教程
  夜鹰教程网  MVC+EasyUI视频教程
  夜鹰教程网  在线考试系统视频教程
  夜鹰教程网  MongoDB视频教程。
  夜鹰教程网 Canvas视频教程
  夜鹰教程网 报表开发视频教程
  热点推荐
一个关于天气预报的WebService【C…
VS2010最大的新特点是并行编程的进…
TextBox控件:asp.net中如何为密码…
Web服务调用实例:实现天气预报的…
ASP.NET程序员面试试题(130道题)
ASP.NET教程:调用WebService的源码…
网站开发全程设计
据说这套.net面试题很多网络公司都…
考考你:C#常见题型及部分答案
原创:.net读取数据库sql2000
伪静态URL重写配置
配置web.config代码asp.net3.5个性…
使用线程池提高性能 Socket网络编…
ASP.NET(C#)GridView表头的增加…
如何找到正确的学习方向【.NET版】…
  最近更新
C#修改注册表demo
一个获取内容中的图片地址的方法
ASP.NET 4.0尚未在 Web 服务器上注…
四大作用域:application,session…
ConfigurationManager不存在的解决…
vs2012_vs2013_vs2015没有Web Dep…
vs2015禁用解决方案中单击打开文件…
微软为Visual Studio 2015新增安卓…
C#如何实现搜索引擎网络爬虫程序
C#中正则表达式的用法
用C#抓取需要登录的页面数据
VS2015新功能
VS2015安装图解教程
vs2015新功能介绍
vs2015安装图解

关于我们 | 网站建设 | 技术辅导 | 常见问题 | 联系我们 | 友情链接

夜鹰教程网 版权所有 www.yyjcw.com All rights reserved 备案号:蜀ICP备08011740号3