IIS模块和C#:如何在将页面内容发送到客户端

时间:2015-09-03 15:58:16

标签: iis module decorator iis-modules

我是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检索的页面内容吗?

谢谢和问候。

1 个答案:

答案 0 :(得分:4)

我认为使用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模块&amp;用于修改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>