[英]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.