【IT168技术文档】
using System; using System.IO; using System.Text; using System.Text.RegularExpressions; using System.Runtime.Remoting; using System.Runtime.Remoting.Proxies; using System.Runtime.Remoting.Messaging; using System.Reflection; namespace FilterRealProxy { /**//**//**//// <summary> /// FilterRealProxy类:一个真实代理, 拦截它所代理对象中方法的返回值,并对需要过滤的返回值进行过滤。 /// </summary> public class FilterRealProxy:RealProxy { private MarshalByRefObject target; public FilterRealProxy(MarshalByRefObject target):base(target.GetType()) { this.target=target; } public override IMessage Invoke(IMessage msg) { IMethodCallMessage callMsg=msg as IMethodCallMessage; IMethodReturnMessage returnMsg = RemotingServices.ExecuteMessage(target,callMsg); //检查返回值是否为String,如果不是String,就没必要进行过滤 if(this.IsMatchType(returnMsg.ReturnValue)) { string returnValue=this.Filter(returnMsg.ReturnValue.ToString(),returnMsg.MethodName); return new ReturnMessage(returnValue,null,0,null,callMsg); } return returnMsg; } protected string Filter(string ReturnValue,string MethodName) { MethodInfo methodInfo=target.GetType().GetMethod(MethodName); object[] attributes=methodInfo.GetCustomAttributes(typeof(StringFilter),true); foreach (object attrib in attributes) { return FilterHandler.Process(((StringFilter)attrib).FilterType,ReturnValue); } return ReturnValue; } protected bool IsMatchType(object obj) { return obj is System.String; } } /**//**//**////<summary> /// StringFilter类:自定义属性类, 定义目标元素的过滤类型 ///</summary> public class StringFilter:Attribute { protected FilterType _filterType; public StringFilter(FilterType filterType) { this._filterType=filterType; } public FilterType FilterType { get { return _filterType; } } } /**//**//**//// <summary> /// 枚举类:用于指定过滤类型,例如:对script过滤还是对html进行过滤? /// </summary> [Flags()] public enum FilterType { Script = 1, Html =2, Object=3, AHrefScript=4, Iframe=5, Frameset=6, Src=7, BadWords=8, //Include=9, All=16 } /**//**//**////<summary> /// 过滤处理类:根据过滤类型,调用相应的过滤处理方法。 ///</summary> public class FilterHandler { private FilterHandler() { } public static string Process(FilterType filterType,string filterContent) { switch(filterType) { case FilterType.Script: filterContent=FilterScript(filterContent); break; case FilterType.Html: filterContent=FilterHtml(filterContent); break; case FilterType.Object: filterContent=FilterObject(filterContent); break; case FilterType.AHrefScript: filterContent=FilterAHrefScript(filterContent); break; case FilterType.Iframe: filterContent=FilterIframe(filterContent); break; case FilterType.Frameset: filterContent=FilterFrameset(filterContent); break; case FilterType.Src: filterContent=FilterSrc(filterContent); break; //case FilterType.Include: // filterContent=FilterInclude(filterContent); // break; case FilterType.BadWords: filterContent=FilterBadWords(filterContent); break; case FilterType.All: filterContent=FilterAll(filterContent); break; default: //do nothing break; } return filterContent; }