Skip to content




Hello world!

Welcome to blog.techweb.com.cn Blogs. This is your first post. Edit or delete it, then start blogging!

文章发表于 未分类.



Asp.net(c#)实现多线程断点续传

     System.IO.Stream iStream = null;
  
   // Buffer to read 10K bytes in chunk:
   byte[] buffer = new Byte[10240];
  
   // Length of the file:
   int length;
  
   // Total bytes to read:
   long dataToRead;
  
   // Identify the file to download including its path.
   string filepath = @”E:\software\SQL Server 2000 Personal Edition.ISO”;
  
   // Identify the file name.
   string filename = System.IO.Path.GetFileName(filepath);
  
   try
   {
   // Open the file.
   iStream = new System.IO.FileStream(filepath, System.IO.FileMode.Open,
   System.IO.FileAccess.Read,System.IO.FileShare.Read);
   Response.Clear();
  
   // Total bytes to read:
   dataToRead = iStream.Length;
  
   long p = 0;
   if(Request.Headers["Range"]!=null)
   {
   Response.StatusCode = 206;
   p = long.Parse( Request.Headers["Range"].Replace(”bytes=”,”").Replace(”-”,”"));
   }
   if(p != 0)
   {
   Response.AddHeader(”Content-Range”,”bytes ” + p.ToString() + “-” + ((long)(dataToRead - 1)).ToString() + “/” + dataToRead.ToString());
   }
   Response.AddHeader(”Content-Length”,((long)(dataToRead-p)).ToString());
   Response.ContentType = “application/octet-stream”;
   Response.AddHeader(”Content-Disposition”, “attachment; filename=” + System.Web.HttpUtility.UrlEncode(Request.ContentEncoding.GetBytes(filename)));
  
   iStream.Position = p;
   dataToRead = dataToRead - p;
   // Read the bytes.
   while (dataToRead > 0)
   {
   // Verify that the client is connected.
   if (Response.IsClientConnected)
   {
   // Read the data in buffer.
   length = iStream.Read(buffer, 0, 10240);
  
   // Write the data to the current output stream.
   Response.OutputStream.Write(buffer, 0, length);
  
   // Flush the data to the HTML output.
   Response.Flush();
  
   buffer= new Byte[10240];
   dataToRead = dataToRead - length;
   }
   else
   {
   //prevent infinite loop if user disconnects
   dataToRead = -1;
   }
   }
   }
   catch (Exception ex)
   {
   // Trap the error, if any.
   Response.Write(”Error : ” + ex.Message);
   }
   finally
   {
   if (iStream != null)
   {
   //Close the file.
   iStream.Close();
   }
   Response.End();
   }
  
    
电脑学习文摘 .

文章发表于 asp.net精选文摘.



动态控制Page页的Head信息

     在以前的ASP程序里我们经常用使用Response.Write动态输出网页Header信息,但在ASP.NET里这个所谓代码与UI分离的指导思想不再希望我们这样做了(当然如果您愿意还可以,这毕竟只是建议而已),以前见过别人用<title ranut=”server” id=”titleControl”>Default Title</title>设置标题的,但本人认为不是很好,因为这会产生多余的id=”titleControl” 个人感觉使用Literal控件控制比较好,因为它不会产生一个多余的字符:),也有人使用js的动态设置标题,但这你让搜索引擎怎么办?
  
  动态控制Page页的Head信息其实很简单
  先看演示: http://www.lvjiyong.com/demo/aspnet/seth…
  演示做的很简单,大家可以下了源码好好看,注解里面都有了
  
  主要使用了Literal与PlaceHolder
  方法放置在BasePage里,下次让WebForm继承BasePage类就可以调用了
  使用Literal设置Title信息
  使用PlaceHolder载入样式表与脚本
  Literal允许我们直接设置文本信息,使用时我们先让程序查找是否有指定的Literal控件,如果有则设置Text
  
  
   /**//// <summary>
   /// 设置Head信息
   /// </summary>
   /// <param name=”_name”>控件</param>
   /// <param name=”_control”>文本</param>
   private void setHeader(string _control,string _text)
   {
   Literal obj = this.FindControl(_control) as Literal;
   if(obj != null)
   {
   obj.Text = _text;
   }
   }
  比如我们在Head区设置了<asp:Literal id=”PageTitle” runat=”server” />,我们可以这样设置标题
  这里先准备一个方法
   /**//// <summary>
   /// 设置网页标题
   /// </summary>
   /// <param name=”_title”>网页标题</param>
   protected void SetTitle(string _title)
   {
   setHeader(”PageTitle”,”<title>” + _title + “</title>”);
   在WebFrom中我们就可以这样设置标题了
  this.SetTitle(”吕的部落格”);
  Description,Keywords等的方法一样,不过要设置Meta,这个就不讲了,可以看源码
  
  下面我再说一下js与css的载入,这次我们用到的是PlaceHolder控件,为什么用这个不沿用Literal,自己想想
  PlaceHolder一般只占用位置,方便我们动态加载控件,这样载入js与css就方便多了
  首先了也是查找指定的PlaceHolder控件
   /**//// <summary>
   /// 查找LoadHeader的PlaceHolder容器
   /// </summary>
   /// <returns></returns>
   private Control findHeader()
   {
   return this.FindControl(”LoadHeader”);
   }再是动态加入控件
   /**//// <summary>
   /// 装载控件到PlaceHolder控件
   /// </summary>
   /// <param name=”_obj”></param>
   protected void LoadPlaceHolder(HtmlGenericControl _obj)
   {
   objHeader = findHeader() as Control;
  
   //载入脚本文件
   if(objHeader != null)
   {
   objHeader.Controls.Add(_obj);
  
   }
   }要载入CSS或JS我们先用HtmlGenericControl创建子控件然后加到PlaceHolder控件中
   /**//// <summary>
   /// 载入指定的样式表文件
   /// </summary>
   /// <param name=”_cssPath”>样式表文件地址</param>
   protected void LoadCss(string _cssPath)
   {
  
  
   HtmlGenericControl objCss = new HtmlGenericControl(”link”);
   objCss.Attributes["rel"] = “stylesheet”;
   objCss.Attributes["type"] = “text/css”;
   objCss.Attributes["href"] = _cssPath;
   objCss.Attributes["media"] = “screen”;
   this.LoadPlaceHolder(objCss);
  
  
   }
  那我们在WebForm中要载入样式表只要使用
  this.LoadCss(”样式表地址”);载入js一样,就不说了
  
  在源码中我写的功能比这里说的强一点点,大家可以自己下了看看.
  
  
    
电脑学习文摘 .

文章发表于 asp.net精选文摘.



ASP.Net项目出错处理方法汇总

    
  1:确认在“配置属性”中的“启用ASP.NET调试”为”True”
  操作步骤:
  VS环境里面,菜单-项目-项目属性(最下得选项)-配置属性(左边第二项)-Debugging-Enable Asp.Net Debugging 设置为True
  作用:
  确定调试器能过启动IIS来调试asp.net页面!
  2:确认你的”web.config”中的”debug=true”
  操作步骤
  打开web.config文件,设置debug=”true”;
  作用:配置调试器可以调试该应用程序
  
  3:若你安装过wind2000 SP4后,则要在命令行执行”regsvr32 i aspnet_isap.dll”
  操作步骤:
  开始-运行-cmd-regsvr32 i aspnet_isap.dll
  作用:
  重新注册aspnet_isap.dll
  
  4:在IIS里查看站点信息,选中”目录安全性”,里面有”匿名访问和身份验证控制”,再点击”编辑..”,确认”集成Windows身份验证”选项被选中
  操作步骤:
  我的电脑-右击-管理-应用程序管理-IIS-默认网站-你得站点-右击-目录安全性-认证和访问方式-勾选匿名访问和身份验证控制,编辑-勾选确认”集成Windows身份验证“
  作用:
  匿名访问:此处设置不是为了解决你得调试问题,是为了能够使局域网或者广域网中其他用户通过输入你得Ip和网站名称来访问该网站
  集成Windows身份验证:刚建立得网站身份验证方式为Windows要求必须用windows用户身份访问该网站,不更该IIS,将无法正常调试!
  5:在IE选项->”安全设置”->”自定义级别”里有”用户验”,确认选中”自动使用当前用户名和密码登录”
  步骤上述已经详细
  
  6:运行C:\WINNT\Microsoft.NET\Framework\v1.0.3705\aspnet_regiis.exe -i
  操作步骤;
  cd到C:\WINNT\Microsoft.NET\Framework\v1.0.3705\目录
  aspnet_regiis.exe -i
  或者start=all progames - visual studio.net 2003-visual studio.net tools - command prompt-aspnet_regiis.exe -i
  作用:
  重新注册当前得.net framework版本即(v1.0.3705)到iis,为了解决调试得时候出现您所运行得.net版本不是v1.1得问题
  
  7:控制面板–管理工具–计算机管理–本地用户和组–用户,双击ASPNET用户,为其隶属于添加Administrators用户
  
  
    
电脑学习文摘 .

文章发表于 asp.net精选文摘.



ASP.NET入门随想之博德之门 类与实例

     内力衡量人的武学修为,而逍遥派的北冥神功实在是宝贝,习此术之人,全身如同一个黑洞,瞬间就将他人一辈子的修炼积累掠为已有,美名其曰”北冥大水,非由自生”、”百川汇海,海纳百川”。
  
    但虚竹却不知学习此术需要散去原先功力,所以当他被无涯子完全化成一个空空如也的和尚时,禁不住放声大哭。其实此举绝对可以理解,对于一个练武之人而言,内功象征积累,虚竹虽然笨了点,但二十几年的积累,顷刻间说没就没,不啻于精神世界的毁灭。
  
    ■ 计算的影响 - 面向过程编程思想
  
    ASP程序员的老祖宗名叫冯·诺依曼,ASP程序员一直以来都按照他的谆谆教导活着。 ASP程序员从来就认为这个世界的所有事情就象人的一生,有一个起点,叫START,还有一个终点,叫END。他要处理的事情,就象人这辈子,从START走到END,没有回头路。
  
    ASP程序员还认为,这个世界的所有事情就象人的一生,分成不同阶段,叫模块。每一个模块都要完成一个相互不同的任务,少年求学,青年生子,中年立命,老年不惑。
  
    ASP程序员又认为,这个世界的所有事情都象人的一生,一共只有三种走法:有时是阔步向前,叫顺序;有时面临选择,叫分支;有时原地打转,徘徊不前,叫循环。
  
    ASP程序员从来就把”不积跬步无以至千里”当着座右铭,所以他把所有类似的事情处理过程都积累起来,记忆成一个个函数,以后碰到同类型的事情,就去调用函数。
  
    ASP程序员把这种活法叫着”面对过程编程思想”,他平时最关心的,就是过程的模型,最注意的,就是这些过程有没有类似的处理过程可以归纳成函数。
  
    即使是面对网站登录这么件小小的事情,ASP程序员仍然遵循自已的信仰,先对这个过程建模,如图4-1,然后去调用以前所有积累的函数,精心编织这个过程的每一个环节:不是要用户提交登录数据吗?他用response.write 这支画笔按照顺序一笔一划地描述出用户填写页面;不是要校验格式吗?他调用JavaScript函数一个个地检查每一个<input>的value值;不是要审核数据吗?他读取用户数据后翻开厚厚的帐目一个个地查找核对;不是要结果吗?他要么带着用户跳转到指定页面,要么又调用函数告诉用户不要鱼目混珠。
  
  
  
  所以ASP程序员活得很开心,他感觉世界尽在他的掌握之中。尽管很早以前有一个位名叫smlltalk的家伙告诉他的这种活法窝囊,当时ASP程序员只是感到不解;又来了个C++说他笨拙,他只是疑惑;还来了个JAVA在他面前耀武扬威,ASP程序员开始彷徨起来。直到有一天,小弟DotNet程序员学成归来,与之促膝长谈,终于,ASP程序员彻底动摇。冥冥之中,记起一位伟人告诫他要与时俱进。但尽管世界在变,ASP程序员依然放不下他多年所积蓄的内力,顷刻间说没就没,不啻于精神世界的毁灭。于是内心有两种呐喊在不断地交织,是在沉默中死去,还是凤凰涅槃?
  ■ 创世纪·六日 - 面向对象编程思想
  
    DotNet程序员信奉OOP教,神是Framework。
  
    第一日,神说,万物皆对象(object),对象有标识、状态与行为;
  
    于是DotNet程序员在大脑中列出Login功能的所有对象:Login对象、Login.aspx页面对象、登录表单frmLogin对象、提示信息lblMessage对象、用户名文本域txtUserName对象、密码文本域对象txtPassword对象和登录按扭btnLogin对象。
  
    第二日,神说,有相同特征和行为的对象抽象为类(class);对象即为类的一实例;
  
    于是DotNet程序员把用户名文本域对象和密码文本域对象抽象成TextBox类,其余分别抽象成Login、Login.aspx、HtmlForm、Label、Button类,并分别实例了类。
  
    第三日,神说,对象的相同特征抽象为属性,相同的行为处理抽象为方法;
  
    于是DotNet程序员把实例frmLogin、lblMessage、txtUserName、txtPassword、btnLogin定义成Login类的属性、并定义方法btnLogin_Click。
  
  private void btnLogin_Click(object sender, System.EventArgs e) {
   if ((txtUserName.Text==”孙二娘”)&&(txtPassword.Text==”十字坡”))
    lblMessage.Text=”热烈欢迎世界著名武打巨星孙二娘小姐回乡考察投资”;
   else
    lblMessage.Text=”靠,这年头什么都有假的!”;
  }
  
  
  第四日 神说,类要封装;
  
    于是DotNet程序员在类标识、属性和方法前都分别加上public、private、protected。
  
    第五日 神说,类可以继承和合成;
  
    于是DotNet程序员把Login.aspx定义成Login的派生类,在Login.aspx开头加上如下声明语句:
  
  <%@ Page Inherits=”WebApplication1.Login” %>
  
    第六日 神说,类有多态。
  
    于是DotNet程序员对自己说,我暂时不需要,随后躺下。
  
    很快他就睡着,只听见他的梦呓缓缓传来:六日,我就拖几个控件,定义几个ID,加一段事件处理代码,感谢万能的主framework和他的忠实仆役Visual Studio,吸星***,爽!
    
电脑学习文摘 .

文章发表于 asp.net精选文摘.



ASP.NET 翻页后继续维持排序(1)

     要想实现翻页后继续排序,实现这样的效果:
  
    比如共 15笔记录,每页显示10条
  
    则排序时:第一页将前10条记录排序,翻第二页时后五条再单独排序.
  
    要注意以下几点:
  
    1.如果数据很多,最好不要把数据集放到缓存中(viewstate),影响性能
  
    2. ViewState中存放上次是哪个e.expression并且存放此e.expression是升序还是降序
  
    示例如下:
  
    1.现有的排序事件是这样写的,这个是点击上面排序标题时用:
  
  private void grdProjTrace_SortCommand(object source, DataGridSortCommandEventArgs e)
  {
   this.grdProjTrace.CurrentPageIndex = 0;
   DataView dv = 得到数据代码;
   string strSort = “”;
   string strOrder =”";//排序方式。0,降序,1升序
   if(ViewState["SortExpresstion"] != null)
   {
    strSort = ViewState["SortExpresstion"].ToString();
    strSort = strSort.Substring(0,strSort.Length -1);
    strOrder = ViewState["SortExpresstion"].ToString();
    strOrder = strOrder.Substring(strOrder.Length -1);
   }
   if(e.SortExpression == “CustomerName”)
   {
    if(strSort != “CustomerName”)
    {
     this.ViewState["SortExpresstion"] = ustomerName0″;
     dv.Sort = “CustomerName DESC”;
    }
    else
    {
     if(strOrder == “0″)
     {
      this.ViewState["SortExpresstion"] = “CustomerName1″;
      dv.Sort = “CustomerName ASC”;
     }
     else
     {
      this.ViewState["SortExpresstion"] = “CustomerName0″;
      dv.Sort = “CustomerName DESC”;
     }
    }
   }
   if(e.SortExpression == “fullName”)
   {
    if(strSort != “fullName”)
    {
     this.ViewState["SortExpresstion"] = “fullName0″;
     dv.Sort = “fullName DESC”;
    }
    else
    {
     if(strOrder == “0″)
     {
      this.ViewState["SortExpresstion"] = “fullName1″;
      dv.Sort = “fullName ASC”;
     }
     else
     {
      this.ViewState["SortExpresstion"] = “fullName0″;
      dv.Sort = “fullName DESC”;
     }
    }
   }
   this.grdProjTrace.DataSource = dv;
   this.grdProjTrace.DataBind();
  }
  
  
    
电脑学习文摘 .

文章发表于 asp.net精选文摘.



ASP.NET 翻页后继续维持排序(2)

     2.下面这个方法是自己写的,翻页事件中调用。
  
  private void ChangePageDataBind()
  {
   DataView dv = 得到数据代码;
   string strSort = “”;
   string strOrder =”";//排序方式。0,降序,1升序
   if(ViewState["SortExpresstion"] != null)
   {
    strSort = ViewState["SortExpresstion"].ToString();
    strSort = strSort.Substring(0,strSort.Length -1);
    strOrder = ViewState["SortExpresstion"].ToString();
    strOrder = strOrder.Substring(strOrder.Length -1);
   }
   if(this.ViewState["SortExpresstion"] != null)
   {
    if(strSort == “CustomerName”)
    {
     if(strOrder == “1″)
     {
      this.ViewState["SortExpresstion"] = “CustomerName1″;
      dv.Sort = “CustomerName ASC”;
     }
     else
     {
      this.ViewState["SortExpresstion"] = “CustomerName0″;
      dv.Sort = “CustomerName DESC”;
     }
    }
   }
   if(this.ViewState["SortExpresstion"] != null)
   {
    if(strSort == “fullName”)
    {
     if(strOrder == “1″)
     {
      this.ViewState["SortExpresstion"] = “fullName1″;
      dv.Sort = “fullName ASC”;
     }
     else
     {
      this.ViewState["SortExpresstion"] = “fullName0″;
      dv.Sort = “fullName DESC”;
     }
    }
   }
   this.grdProjTrace.DataSource = dv;
   this.grdProjTrace.DataBind();
  }
  
    上面两方法只要修改要排序的字段名,就可以直接调用了.
  
    1、方法很简单实用,这里就不说了。
  
    2、方法是这样用的:
  
  private void grdProjTrace_PageIndexChanged(object source, DataGridPageChangedEventArgs e)
  {
   try
   {
    try
    {
     this.grdProjTrace.CurrentPageIndex = e.NewPageIndex;
    }
    catch
    {
     this.grdProjTrace.CurrentPageIndex = 0;
    }
  
    this.ChangePageDataBind();
   }
   catch(System.Exception errWS)
   {
    //异常
   }
  }
    
电脑学习文摘 .

文章发表于 asp.net精选文摘.



谈谈HtmlControl与WebControl的区别与用途

     Web控件和Html控件虽然好多功能相同并且长得很像
  但是它们的内部实现机制是完全不一样的
  Web控件要比Html控件执行效率要好
  
  1. 使用起来也相当方便,举个简单的例子,例如Button的生成:
  Html控件是将庞大控件集合全部弄到页面中,用到哪个功能,就设置一下属性,如下:
  <input type=submit/button runat=server>
  这样会占用相当大的控件资源
  
  Web控件是将集成式的拆解成单功能的:
  <asp:button id=”btnOK” />
  这样就可以节省不必要的控件所占用的资源了
  
  2.Web控件具有回送功能,能够用ViewState维持控件的状态.
   Html控件则不能,当点击页面的操作,其状态就会丢失.
   可以做这样的一个实验:
   I. 分别建立两个文件: a.html b.aspx
   II.在a.html页面中加Html控件的RadioButton和一个button,
   在b.aspx中加Web控件的RadioButton和一个button
   III.a.html直接双击浏览器运行,b.aspx通过IIS运行
   IV.在a.html运行界面中,选中RadioButton,再单击Button按钮,会发现RadioButton会
   取消选中(丢失其状态),但在b.aspx页面执行同样的操作,RadioButton不会丢失,因为ViewState
   给它保存了状态. 您可以在运行界面点击浏览器菜单”查看”->“源文件”,打开Html代码文件,
   找到加密后的ViewState,类似于下面:
   <input type=”hidden” name=”_VIEWSTATE” value=”dDw0ajfmafmjfzzmj4″/>
   其实ViewState实现原理也是将一些信息放到隐藏的一个控件中,并且asp.net生成的ViewState信息
  
   是存储在客户端的
   这里要注意的一点是:
   只有当格式为*.aspx文件,并且控件具有属性:”runat=server”时,回送功能才能打开
  
  
  3. Html控件与Web控件最大的区别是它们对事件处理的方法不同。对于Html窗体控件,
  当引发一个事件时,浏览器会处理它。但对于Web控件,事件仅由浏览器生成,但浏览
  器不会处理它,客户端要给服务器发个信息,告诉服务器处理事件。 不过有些事件,
  比如:
   按下键/移动/鼠标等事件,Asp.net中没有这些事件
   (因为这些事件即时性强,服务器处理得不够及时),这时候Html控件就发挥其作用了,结合Html事件
  
   协助完成.
  
  如下是一些Html常用的事件:
  在浏览器上执行的Html控件事件:
  
  单击时触发:
  <INPUT type=”button” value=”Click Me” onclick=”alert(’Hi,你好!’);”>
  
  鼠标弹起时触发:
  <INPUT type=”button” value=”Click Me” onmouseup=”alert(’Hi,你好!’);”>
  
  //悬浮在控件上方时触发
  <INPUT type=”button” value=”Click Me” onmouseover=”alert(’Hi,你好!’);”>
  
  //鼠标在控件上方移动时触发
  <INPUT type=”button” value=”Click Me” onmousemove=”alert(’Hi,你好!’);”>
  
  //双击控件时触发
  <INPUT type=”button” value=”Click Me” ondblclick=”alert(’Hi,你好!’);”>
  
  //当焦点在控件时,按键时触发
  <INPUT type=”button” value=”Click Me” onkeypress=”alert(’Hi,你好!’);”>
  
  //按键按下时触发
  <INPUT type=”button” value=”Click Me” onkeydown=”alert(’Hi,你好!’);”>
  
  
    
电脑学习文摘 .

文章发表于 asp.net精选文摘.



随机得到Access数据库记录

     由于Access数据库记录集缓存的原因,从代码里得到Access数据库随机记录是得不到,需要用随机SQL语句的办法来消除缓存。
  
  下面就是例子:
  
  查看例子http://dotnet.aspx.cc/Exam/GetRandom.aspx
  
  <%@ Page Language=”C#” Debug=”true” %>
  <%@ import Namespace=”System.Data” %>
  <%@ import Namespace=”System.Data.OleDb” %>
  <title>随机得到Access数据库记录</title>
  <script runat=”server”>
  void Page_Load(Object src,EventArgs e)
  {
  if(!IsPostBack)
   {
   string MyConnString = “Provider=Microsoft.Jet.OleDB.4.0;Data Source=”
   + Server.MapPath(”aspxWeb.mdb.ascx”);
   Random R = new Random();
   int intRandomNumber = R.Next(1,1000);
  
   string sql = “select top 10 id As 序号,Title As 标题 from Document Order By Rnd(”
   + (-1 * intRandomNumber).ToString() + “*id)”;
   OleDbConnection MyConnection = new OleDbConnection(MyConnString);
   MyConnection.Open();
   OleDbCommand cmd = new OleDbCommand(sql,MyConnection);
   OleDbDataReader dr = cmd.ExecuteReader();
  
   DataGrid1.DataSource = dr;
   DataGrid1.DataBind();
   cmd.Dispose();
   MyConnection.Close();
   MyConnection.Dispose();
   MyConnection = null;
   }
  }
  
  </script>
  <form runat=server>
  <asp:DataGrid id=”DataGrid1″ HorizontalAlign=”Center”
   Width=”600px” runat=”server” Font-Size=”9pt”>
   <AlternatingItemStyle BackColor=”#EEEEEE”></AlternatingItemStyle>
   <HeaderStyle BackColor=”#AAAADD” Font-Bold=”True” HorizontalAlign=”Center” />
  </asp:DataGrid>
  </form>
  
    
电脑学习文摘 .

文章发表于 asp.net精选文摘.



asp.net 2.0中的URL重写以及urlMappings问题(1)

     在asp.net2.0中的urlMappings倒是非常好用,可惜暂不支持正则表达式,不过,好在如果用IHttpModule的话
  
  不管什么样的请求都会先经过IHttpModule这样就为URL重写提供了一个好机会:
  
  下面是我写的一个IHttpModule:
  
  using System;
  using System.Web;
  
  public class ReWriteModule:IHttpModule
  {
   public ReWriteModule()
   {
   }
   public override string ToString()
   {
   return this.GetType().ToString();
   }
  
  
  void IHttpModule.Dispose()
  {
  
  }
   private static System.Xml.XmlDocument ruleDoc = null;
   private static System.Xml.XmlDocument GetRuleConfig(System.Web.HttpContext app)
   {
   if (ruleDoc == null)
   {
   ruleDoc = new System.Xml.XmlDocument();
   ruleDoc.Load(app.Server.MapPath(”~/rule.xml”));
   }
   return ruleDoc;
   }
   public static string GetUrl(System.Web.HttpContext cxt,string path)
   {
  
   System.Xml.XmlDocument doc = GetRuleConfig(cxt);
   System.Xml.XmlNodeList lst= doc.GetElementsByTagName(”RewriterRule”);
   string pat=”";
   foreach (System.Xml.XmlNode nd in lst)
   {
   System.Xml.XmlNodeList sub = nd.ChildNodes[0].ChildNodes;
   foreach(System.Xml.XmlNode chk in sub)
   {
   pat = “^” + chk.InnerText+”$”;
   System.Text.RegularExpressions.Regex reg = new System.Text.RegularExpressions.Regex(pat, System.Text.RegularExpressions.RegexOpti…piled | System.Text.RegularExpressions.RegexOptions.IgnoreCase);
   if(reg.IsMatch(path))
   {
   return reg.Replace(path, nd.ChildNodes[1].InnerText);
   }
   }
   }
   return null;
  
   }
  void IHttpModule.Init(HttpApplication context)
  {
   context.BeginRequest += delegate(object sender, EventArgs e)
   {
  
  
   System.Web.HttpContext cxt = context.Context;
  
   if (cxt.Request.ContentType != “image/pjpeg”)
   {
   string type = cxt.Request.ContentType.ToLower();
   string path = cxt.Request.Path;
   string apppath = cxt.Request.ApplicationPath;
   path = path.Remove(0, apppath.Length);
   path = “~” + path;
  
   string newUrl = GetUrl(cxt, path.TrimEnd().TrimStart());
   if (newUrl != null)
   {
   cxt.Response.Filter = new ResponseFilter(cxt.Response.Filter,cxt.Request.Path);
   cxt.Response.Write(”请求的路径:” + path);
   cxt.Response.Write(”<BR>”);
   cxt.Response.Write(”转向的目的URL:” + newUrl);
   cxt.Response.Write(”<BR>”);
   cxt.RewritePath(newUrl);
  
  
  
   }//如果要求处理所有的请求时用到
   //else
   //{
   // cxt.Response.Write(cxt.Request.Path + “<BR>”);
   // cxt.Response.Write(”你请求的资源不存在或无权访问!”);
   // cxt.Response.Flush();
   // cxt.Response.End();
   //}
   }
  
   };
   }
  
  
  }
  
  
    
电脑学习文摘 .

文章发表于 asp.net精选文摘.