IHttpModule Response.Filter Пишите без закрытого HTML - PullRequest
0 голосов
/ 14 июля 2011

Я написал собственный IHttpModule, но он вызывает проблемы, когда в источнике нет закрывающего тега.Я наткнулся на несколько страниц в CMS, где я запускаю это для страницы .aspx, которая больше используется как обработчик и воздерживается от закрытия html, чтобы дать пользователю ответ через ajax.

Вотмой источник:

public class HideModule : IHttpModule
{
    public void Dispose()
    {
        //Empty
    }

    public void Init(HttpApplication app)
    {
        app.ReleaseRequestState += new EventHandler(InstallResponseFilter);
    }

    // ---------------------------------------------
    private void InstallResponseFilter(object sender, EventArgs e)
    {
        HttpResponse response = HttpContext.Current.Response;

        string filePath = HttpContext.Current.Request.FilePath;
        string fileExtension = VirtualPathUtility.GetExtension(filePath);

        if (response.ContentType == "text/html" && fileExtension.ToLower() == ".aspx")
            response.Filter = new PageFilter(response.Filter);
    }
}

public class PageFilter : Stream
{
    Stream          responseStream;
    long            position;
    StringBuilder   responseHtml;

    public PageFilter (Stream inputStream)
    {
        responseStream = inputStream;
        responseHtml = new StringBuilder ();
    }

    //Other overrides here

    public override void Write(byte[] buffer, int offset, int count)
    {
        string strBuffer = System.Text.UTF8Encoding.UTF8.GetString (buffer, offset, count);

        Regex eof = new Regex ("</html>", RegexOptions.IgnoreCase);

        if (!eof.IsMatch (strBuffer))
        {
            responseHtml.Append (strBuffer);
        }
        else
        {
            responseHtml.Append (strBuffer);

            string  finalHtml = responseHtml.ToString();

            //Do replace here

            byte[] data = System.Text.UTF8Encoding.UTF8.GetBytes(finalHtml);

            responseStream.Write(data, 0, data.Length);
        }
    }
    #endregion
}

Как вы можете видеть, это здорово, потому что он выполняет замену только в последний раз, когда вызывается Write, но если в выводе нет закрывающего HTML-тега, blammo.

Мой лучший вариант - даже не добавлять новый фильтр, если закрывающий HTML не найден.Но я не думаю, что смогу перехватить весь поток так рано.В противном случае, есть другой способ обнаружить запись в конце потока, кроме поиска закрывающего HTML-тега?

Заранее спасибо.

1 Ответ

0 голосов
/ 14 июля 2011

Ну, если это WebForms, вы должны иметь возможность сделать что-то подобное в вашей функции InstallResponseFilter:

if(Application.Context.CurrentHandler is System.Web.UI.Page
                    && Application.Request["HTTP_X_MICROSOFTAJAX"] == null
                    && Application.Request.Params["_TSM_CombinedScripts_"] == null)
{
response.Filter=new PageFilter(response.Filter);
}
...