IIS模块和C#:在将页面内容发送到客户端之前如何对其进行修改 [英] IIS module and C#: how to modify the page content before sending it to client

查看:94
本文介绍了IIS模块和C#:在将页面内容发送到客户端之前如何对其进行修改的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是IIS模块和C#领域的新手.

I am new to the IIS module and C# area.

在网站将页面内容发送给客户端之前,我需要修改网站特定目录中静态HTML文件的内容.修改包括添加横幅,页脚等.

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. The modification includes adding the banner, footer, etc.

根据我的研究,我应该能够通过IIS模块实现我的目标(对吗?).这是我的代码:

Based on my research, I should be able to achieve my goal through IIS Module (correct?). 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?
            }
        }
    }
}

我不确定PreSendRequestContent是否是开始修改页面内容的正确事件.有人可以指出我正确的方法来获取IIS检索的页面内容吗?

I am not sure whether PreSendRequestContent is the right event to start modifying page content. Could someone point me to the right way to get page content retrieved by IIS?

感谢和问候.

推荐答案

我认为使用MVC框架会更好,因为它易于维护并且可以执行任何操作.但是,如果您仍然想通过IIS HTTP模块来修改静态HTML,请按以下步骤进行.希望这会有所帮助.

I think it's better to use the MVC Framework because It's easy to maintain and you can do anything. But here's the process if you still want to modify static HTMLs by a IIS HTTP Module. Hope this helps.

首先,添加一个处理程序&一个构建提供程序以通过IIS处理静态HTML文件.

At the first, Add a handler & a build provider to process static HTML files by IIS.

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内容的过滤器.

Next, Write a HTTP Module & a filter to modify your HTML contents.

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

Finally, Add the HTTP Module to your 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>

这篇关于IIS模块和C#:在将页面内容发送到客户端之前如何对其进行修改的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆