asp.net mvc 下使用 HttpResponse.Filter

來源:互聯網
上載者:User

HttpResponse 的 Filter 屬性是一個 Stream,通過重寫這個流的方法,可以對 response 對象的輸出進行修改。自訂 filter 時,如果直接從 Stream 派生新類,則必須要實現 Stream 的全部抽象方法,而實際應用中,只有 Write 方法才是建立過濾器時最關心的。這裡的 HttpResponseFilter抽象類別可以提供一點方便。

    /// <summary>  
/// ResponseFilter 提供一個基類,從此類繼承可以方便地建立篩選器類。
/// 子類只須實現 Write 方法,而不必費心於 Stream 類其他抽象方法的實現。
///
/// 對子類的說明
/// (1) 子類必須提供一個公有建構函式,並調用此類的建構函式,以初始化基礎流。
/// (2) 子類可以從 Sink 屬性擷取篩選器的基礎流
/// (3) 子類必須實現 Write 方法,以實現篩選邏輯。Write 是從 Stream 繼承下來的抽象方法。
///
/// PageTitelFilter 類提供了一個樣本,示範怎樣實現子類
/// </summary>
public abstract class HttpResponseFilter : Stream
{
private Stream _sink;
private long _position;
/// <summary>
/// 執行個體化此類的新執行個體。
/// </summary>
/// <param name="sink">基礎流</param>
protected HttpResponseFilter(Stream sink)
{
this._sink = sink;
}
/// <summary>
/// 擷取此篩選器的基礎流
/// </summary>
protected Stream Sink
{
get
{
return _sink;
}
}
public override sealed long Seek(long offset, SeekOrigin origin)
{
return _sink.Seek(offset, origin);
}
public override sealed void SetLength(long value)
{
_sink.SetLength(value);
}
public override sealed void Close()
{
_sink.Close();
}
public override sealed void Flush()
{
_sink.Flush();
}
public override sealed int Read(byte[] buffer, int offset, int count)
{
return _sink.Read(buffer, offset, count);
}
public override sealed bool CanRead
{
get
{
return true;
}
}
public override sealed bool CanSeek
{
get
{
return true;
}
}
public override sealed bool CanWrite
{
get
{
return true;
}
}
public override sealed long Length
{
get
{
return 0;
}
}
public override sealed long Position
{
get
{
return _position;
}
set
{
_position = value;
}
}
}

從這個類繼承,可以很容易的寫出一個 filter 類,這個 filter 將頁面標題替換成指定的值:

    [Obsolete("此類僅作為樣本")]  
/// <summary>
/// 這個類示範如何? HttpResponseFilter 類。
/// 如果一個使用此類作為篩選器,則會把頁面的標題
/// 設為傳遞給建構函式的 title 參數
/// </summary>
public class PageTitleFilter : HttpResponseFilter
{
private string _pageTitle;
public PageTitleFilter(Stream sink, string title)
: base(sink)
{
this._pageTitle = title;
}
public override void Write(byte[] buffer, int offset, int count)
{
byte[] data = new byte[count];
Buffer.BlockCopy(buffer, offset, data, 0, count);
string s = System.Text.Encoding.UTF8.GetString(data);
if (string.IsNullOrEmpty(s) == false)
{
string pattern = @"<title>.*</title>";
string replacement = string.Format("<title>{0}</title>", _pageTitle);
s = Regex.Replace(s, pattern, replacement, RegexOptions.IgnoreCase | RegexOptions.Singleline);
byte[] outData = System.Text.Encoding.UTF8.GetBytes(s);
Sink.Write(outData, 0, outData.GetLength(0));
}
else
{
Sink.Write(buffer, offset, count);
}
}
}

在 asp.net mvc 下,可以使用 ActionFilterAttribute 應用 HttpResponseFilter:

    public class HttpResponseFilterAttribute : ActionFilterAttribute  
{
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
if (System.Web.Hosting.HostingEnvironment.ApplicationVirtualPath != "/")
{
filterContext.HttpContext.Response.Filter = new PageTitleFilter(filterContext.HttpContext.Response.Filter, "demo title" );
}
}
}

將 HttpResponseFilterAttribute 應用到 MyController,MyController 中所有的 Action 輸出的頁面標題都將被替換為 "demo title"

    [HttpResponseFilterAttribute]  
public class MyController : Controller
{
// ...
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.