|
上周的工作要求在.net 2.0下进行网站的简、繁转换,当然不会是用js来实现了。
规则:
以URL地址来决定简繁的显示,zh-cn/index.htm为简体,zh-tw/index.htm为繁体。
思路很简单,以IHttpHandler接口为基类,写一个类,用来处理HttpHandler,用ProcessRequest方法来处理客户端的请求。在ProcessRequest方法中获取url值,有zh-tw就用繁体,反之用简体。
using System; using System.IO; using System.Data; using System.Configuration; using System.Collections.Generic; 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; using System.Text; using System.Text.RegularExpressions; using Microsoft.VisualBasic;
导入以上命名空间,注意Microsoft.VisualBasic,要先引用一下Microsoft.VisualBasic。
public class HtmlHttpHandler : IHttpHandler { //这里是定义的一个结构 ,与简繁转换无关,主要设定url重写的规则。 private List<RegexInfo> _regex_list = new List<RegexInfo>();
public HtmlHttpHandler() { DataSet ds = new DataSet(); ds.ReadXml(ConfigurationManager.AppSettings["RegexsXml"]); foreach (DataRow r in ds.Tables["regex"].Rows) _regex_list.Add(new RegexInfo(((string)r["b"]).Trim(), ((string)r["a"]).Trim())); }
//主方法
public void ProcessRequest(HttpContext context) { string path = context.Request.Path; //foreach (RegexInfo r in _regex_list) //path = Regex.Replace(path, r._before, r._after); //url重写 //开始判断并转换 if (path.IndexOf("zh-tw") != -1) { path = path.Replace("zh-tw", "zh-cn"); //以自定义方式过滤 context.Response.Filter = new CnToTwStream(context.Response.Filter, context.Response.ContentEncoding); } context.Server.Transfer(path); }
// Override the IsReusable property. public bool IsReusable { get { return true; } } }
CnToTwStream类实现简繁的转换
class CnToTwStream : Stream { private Stream _sink; private MemoryStream _ms; private Encoding _encoding;
public CnToTwStream(Stream sink, Encoding encoding) { _sink = sink; _ms = new MemoryStream(); _encoding = encoding; }
public override bool CanRead { get { return false; } }
public override bool CanSeek { get { return false; } }
public override bool CanWrite { get { return true; } }
public override long Length { get { return _ms.Length; } }
public override long Position { get { return _ms.Position; } set { throw new NotSupportedException(); } }
public override int Read(byte[] buffer, int offset, int count) { throw new NotSupportedException(); }
public override long Seek(long offset, System.IO.SeekOrigin direction) { throw new NotSupportedException(); }
public override void SetLength(long length) { throw new NotSupportedException(); }
public override void Close() { _ms.Close(); byte[] buffer_cn = _ms.GetBuffer(); string str_cn = _encoding.GetString( buffer_cn ); //用Strings类的StrConv方法,其中TraditionalChinese是VisualBasic中的一个枚举 string str_tw = Strings.StrConv(str_cn, VbStrConv.TraditionalChinese, 0); str_tw = str_tw.Replace("__zh-cn__", "__zh-tw__"); byte[] buffer_tw = _encoding.GetBytes(str_tw); using (_sink) { _sink.Write(buffer_tw, 0, buffer_tw.Length); } }
public override void Flush() { _ms.Flush(); }
public override void Write(byte[] buffer, int offset, int count) { _ms.Write(buffer, offset, count); } }
出处:蓝色理想
责任编辑:moby
上一页 URL重写实现IHttpHandler接口 下一页
◎进入论坛网络编程版块参加讨论
|