我想用httpmodule或者httphandler对所有aspnet输出的内容进行过滤,但是遇见了问题,我无法把Response里的东西获取出来,后来发现只能在BeginRequest的时候给Response加入一个Response.Filter的过滤器后,在过滤器中实现,但又引起了一个新问题BeginRequest的时候我无法知道最终Response的时候会输出一个什么样的东西,是一个页面?还是一个动态生成的图片(比如校验码)如果是图片的话,经过我的过滤处理,图片受到了损坏,造成无法显示请问各位达人,我该怎么办才好?前提是必须用httpmodule或者httphandler,不能使用页面基类去重写Render方法来实现。对了,我曾经试图,在过滤器中将原本的Stream保存一个副本,在EndRequest的时候已经知道Reponse的类型了,判断是图片的话,进行还原,也宣布失败,我也曾怀疑,是我的过滤器的编码方式或者别的什么导致的图片损坏,但不知道如何做才能不损坏贴个代码,大家帮忙看看,先谢啦。 string PageContent = Encoding.GetString(buffer, offset, count); foreach (TextReplaceRules MyTextReplaceFilterRules in ReplaceRules)
{
PageContent = PageContent.Replace(MyTextReplaceFilterRules.OriginText, MyTextReplaceFilterRules.ResultText);
} byte[] bytePageContent = Encoding.GetBytes(PageContent); m_stream.Write(bytePageContent, offset, count);
---------------------
上面进行替换的内容MyTextReplaceFilterRules.OriginText, MyTextReplaceFilterRules.ResultText基本没什么问题,即便不替换也会出问题,所以和这里应该没关系编码方式我试过了ASC2和UTF-8
{
PageContent = PageContent.Replace(MyTextReplaceFilterRules.OriginText, MyTextReplaceFilterRules.ResultText);
} byte[] bytePageContent = Encoding.GetBytes(PageContent); m_stream.Write(bytePageContent, offset, count);
---------------------
上面进行替换的内容MyTextReplaceFilterRules.OriginText, MyTextReplaceFilterRules.ResultText基本没什么问题,即便不替换也会出问题,所以和这里应该没关系编码方式我试过了ASC2和UTF-8
解决方案 »
- 页面沾的代码,我觉得我沾的挺有技术的,可惜就是报错。哪位大侠帮忙
- 求正则表达式
- 怎么用Image代替ImageButton?
- 怎样在模板列的LinkButton按钮中的单击事件中判断点击了哪一行
- asp.net 文本文件的问题?
- 哪里有现成的"网上调查"功能可以用?知道的告诉下谢谢
- 为什么我点击datagrid更新按钮时出现JAVASCRIPT错误
- 为什么Iewebcontrols装上不能使用,树型菜单显示不出来???急急急
- 关于分页--老问题
- 请问怎样在日历上显示并且可以输入时分秒?150分
- ASP.NET中使用fckeditor.net,如何控制文件上传的路径?
- 很郁闷的怪问题,真的不知道怎么办了?关于验证控件~
using System;
using System.Collections.Generic;
using System.Text;
using System.Web;namespace Ivony.Web
{
/// <summary>
/// 控制aspx页面的HttpModule通用基类
/// </summary>
public abstract class PageModule : IHttpModule
{ private HttpApplication _application; /// <summary>
/// 销毁PageModule实例。
/// </summary>
public void Dispose()
{
} /// <summary>
/// 实现IHttpModule,初始化PageModule
/// </summary>
/// <param name="context">HttpApplication实例</param>
public virtual void Init( HttpApplication context )
{
_application = context; //_application.PostMapRequestHandler += new EventHandler( OnPostMapRequestHandler );
_application.PreRequestHandlerExecute += new EventHandler( OnPreRequestHandlerExecute );
_application.PostRequestHandlerExecute += new EventHandler( OnPostRequestHandlerExecute ); } private void OnPreRequestHandlerExecute( object sender, EventArgs e )
{
_page = Context.Handler as System.Web.UI.Page; if ( _page != null && !( _page is IDontExecutePageModule ) )
OnPrePageExecute( sender, e ); } /// <summary>
/// 当执行页面处理程序之前发生
/// </summary>
/// <param name="sender">事件源</param>
/// <param name="e">事件参数</param>
protected virtual void OnPrePageExecute( object sender, EventArgs e )
{ }
private void OnPostRequestHandlerExecute( object sender, EventArgs e )
{
if ( _page != null && !( _page is IDontExecutePageModule ) )
OnPostPageExecute( sender, e );
} /// <summary>
/// 当执行页面处理程序执行完毕时发生
/// </summary>
/// <param name="sender">事件源</param>
/// <param name="e">事件参数</param>
protected virtual void OnPostPageExecute( object sender, EventArgs e )
{ }
private System.Web.UI.Page _page; /// <summary>
/// 获取当前请求的页面对象
/// </summary>
protected System.Web.UI.Page Page
{
get { return _page; }
} /// <summary>
/// 获取当前的请求的Http上下文信息
/// </summary>
protected HttpContext Context
{
get { return _application.Context; }
} /// <summary>
/// 获取模块所在的HttpApplication实例
/// </summary>
protected HttpApplication ApplicationInstanse
{
get { return _application; }
}
}
}
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.Caching;
using System.Configuration;
using System.Xml.Serialization;namespace Cnlamar.Web.HttpModule
{
public class TextReplace : IHttpModule
{
#region IHttpModule Members public void Dispose()
{
} public void Init(HttpApplication context)
{
context.ReleaseRequestState += new EventHandler(context_EndRequest);
} public void context_EndRequest(object sender, EventArgs e)
{
HttpApplication application = (HttpApplication)sender; if (application.Response.ContentType.ToLower().IndexOf("image") <= -1)
{
TextReplaceFilter MyTextReplaceFilter = new TextReplaceFilter(application.Response.Filter);
MyTextReplaceFilter.Encoding = application.Response.ContentEncoding;
MyTextReplaceFilter.ReplaceRules = TextReplaceConfiguration.GetConfig().Rules;
application.Response.Filter = MyTextReplaceFilter;
}
}
#endregion
} class TextReplaceFilter : System.IO.Stream
{
public bool IsRestore = false; private System.IO.Stream m_stream;
private long m_position; public TextReplaceFilter(System.IO.Stream InputStream)
{
m_stream = InputStream;
} public TextReplaceRulesCollection ReplaceRules
{
get
{
return _ReplaceRules;
}
set
{
_ReplaceRules = value;
}
}
private TextReplaceRulesCollection _ReplaceRules; public System.Text.Encoding Encoding
{
get
{
return _Encoding;
}
set
{
_Encoding = value;
}
}
System.Text.Encoding _Encoding = System.Text.Encoding.UTF8; public override bool CanRead
{ get { return true; } } public override bool CanSeek
{ get { return false; } } public override bool CanWrite
{ get { return false; } } public override long Length
{ get { return 0; } } public override long Position
{
get { return m_position; }
set { m_position = value; }
} public override long Seek(long offset, System.IO.SeekOrigin direction)
{
return 0;
} public override void SetLength(long length)
{
m_stream.SetLength(length);
} public override void Close()
{
m_stream.Close();
} public override void Flush()
{
m_stream.Flush();
} public override int Read(byte[] buffer, int offset, int count)
{
return m_stream.Read(buffer, offset, count);
} public override void Write(byte[] buffer, int offset, int count)
{
string PageContent = Encoding.GetString(buffer, offset, count); foreach (TextReplaceRules MyTextReplaceFilterRules in ReplaceRules)
{
PageContent = PageContent.Replace(MyTextReplaceFilterRules.OriginText, MyTextReplaceFilterRules.ResultText);
} //System.Text.RegularExpressions.Regex regex;
//foreach (TextReplaceRules MyTextReplaceFilterRules in ReplaceRules)
//{
// regex = new System.Text.RegularExpressions.Regex(MyTextReplaceFilterRules.OriginText);
// PageContent = regex.Replace(PageContent, MyTextReplaceFilterRules.ResultText);
//} byte[] bytePageContent = Encoding.GetBytes(PageContent); m_stream.Write(bytePageContent, offset, bytePageContent.Length);
}
}