繁体   English   中英

IIS模块和C#:在将页面内容发送到客户端之前如何对其进行修改

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM