简体   繁体   English

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

[英]IIS module and C#: how to modify the page content before sending it to client

I am new to the IIS module and C# area. 我是IIS模块和C#领域的新手。

I need to modify the content of static HTML files in a specific directory of a website before the website sends the page content to client. 在网站将页面内容发送给客户端之前,我需要修改网站特定目录中静态HTML文件的内容。 The modification includes adding the banner, footer, etc. 修改包括添加横幅,页脚等。

Based on my research, I should be able to achieve my goal through IIS Module (correct?). 根据我的研究,我应该能够通过IIS模块实现目标(对吗?)。 Here is my code: 这是我的代码:

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?
            }
        }
    }
}

I am not sure whether PreSendRequestContent is the right event to start modifying page content. 我不确定PreSendRequestContent是否是开始修改页面内容的正确事件。 Could someone point me to the right way to get page content retrieved by IIS? 有人可以指出我正确的方法来获取IIS检索的页面内容吗?

Thanks and regards. 谢谢并恭祝安康。

I think it's better to use the MVC Framework because It's easy to maintain and you can do anything. 我认为使用MVC框架会更好,因为它易于维护并且可以执行任何操作。 But here's the process if you still want to modify static HTMLs by a IIS HTTP Module. 但是,如果您仍然想通过IIS HTTP模块来修改静态HTML,则这里是过程。 Hope this helps. 希望这可以帮助。

At the first, Add a handler & a build provider to process static HTML files by IIS. 首先,添加处理程序和生成提供程序以通过IIS处理静态HTML文件。

Web.config: 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>

Next, Write a HTTP Module & a filter to modify your HTML contents. 接下来,编写一个HTTP模块和一个过滤器来修改HTML内容。

HTTP Module: HTTP模块:

class ModifyContentModule : IHttpModule
{
    public void Dispose() { }

    public void Init(HttpApplication context)
    {
        context.BeginRequest += (o, e) =>
        {
            context.Response.Filter = new ModifyContentStream(context.Response.Filter);
        };
    }
}

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
}

} }

Finally, Add the HTTP Module to your Web.config 最后,将HTTP模块添加到Web.config

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