簡體   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