[英]IIS module and C#: how to modify the page content before sending it to client
我是IIS模塊和C#領域的新手。
在網站將頁面內容發送給客戶端之前,我需要修改網站特定目錄中靜態HTML文件的內容。 修改包括添加橫幅,頁腳等。
根據我的研究,我應該能夠通過IIS模塊實現目標(對嗎?)。 這是我的代碼:
namespace MyProject
{
public class MyModule : IHttpModule
{
#region IHttpModule Members
public void Dispose()
{
}
public void Init(HttpApplication context)
{
context.PreSendRequestContent +=
new EventHandler(onPreSendRequestContent);
}
#endregion
public void onPreSendRequestContent(Object source, EventArgs e)
{
HttpApplication app = (HttpApplication)source;
HttpRequest request = app.Context.Request;
HttpResponse response = app.Context.Response;
if (request.Path.Contains("my_specific_directory"))
{
//add banner and footer to the page content
//which class, methods, or properties to use?
}
}
}
}
我不確定PreSendRequestContent是否是開始修改頁面內容的正確事件。 有人可以指出我正確的方法來獲取IIS檢索的頁面內容嗎?
謝謝並恭祝安康。
我認為使用MVC框架會更好,因為它易於維護並且可以執行任何操作。 但是,如果您仍然想通過IIS HTTP模塊來修改靜態HTML,則這里是過程。 希望這可以幫助。
首先,添加處理程序和生成提供程序以通過IIS處理靜態HTML文件。
Web.config文件:
<system.webServer>
<handlers>
<add name="html" verb="GET,HEAD,POST,DEBUG" path="*.html" type="System.Web.UI.PageHandlerFactory" />
</handlers>
</system.webServer>
<system.web>
<compilation>
<buildProviders>
<add extension=".html" type="System.Web.Compilation.PageBuildProvider" />
</buildProviders>
</compilation>
</system.web>
接下來,編寫一個HTTP模塊和一個過濾器來修改HTML內容。
HTTP模塊:
class ModifyContentModule : IHttpModule
{
public void Dispose() { }
public void Init(HttpApplication context)
{
context.BeginRequest += (o, e) =>
{
context.Response.Filter = new ModifyContentStream(context.Response.Filter);
};
}
}
過濾:
public class ModifyContentStream : Stream
{
private Stream _base;
private MemoryStream _memoryBase = new MemoryStream();
public ModifyContentStream(Stream stream)
{
_base = stream;
}
public override void Write(byte[] buffer, int offset, int count)
{
_memoryBase.Write(buffer, offset, count);
}
public override void Flush()
{
// Get static HTML code
string html = Encoding.UTF8.GetString(_memoryBase.GetBuffer());
// Modify your HTML
// Sample: Replace absolute links to relative
Regex regex = new Regex("(href=\")http:\\/\\/www\\.example\\.com(\\/[^\"']+\\.[^\"']+\")");
Match match = regex.Match(html);
while (match.Success)
{
string oldValue = match.Value;
string newValue = match.Groups[1].Value + match.Groups[2].Value;
html = html.Replace(oldValue, newValue);
match = match.NextMatch();
}
// Flush modified HTML
byte[] buffer = Encoding.UTF8.GetBytes(html);
_base.Write(buffer, 0, buffer.Length);
_base.Flush();
}
#region Rest of the overrides
}
}
最后,將HTTP模塊添加到Web.config
Web.config文件
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<remove name="ModifyContent" />
<add name="ModifyContent" type="ModifyContentModule.ModifyContentModule, ModifyContentModule" />
</modules>
<handlers>
<add name="html" verb="GET,HEAD,POST,DEBUG" path="*.html" type="System.Web.UI.PageHandlerFactory" />
</handlers>
</system.webServer>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.