Inject js from IhttpModule

2019-03-20 05:34发布

问题:

i trying to inject js to page (to tags) by using ihttpmodule. but js isn't injected.

what i did:

the page:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="MyTempProject._Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    <title>Temp</title>   
</head>
<body>
    <form id="form1">
    <div>

    </div>
    </form>
</body>
</html>

the ihttpmodule:

public class MyExtensionModule : IHttpModule
    {
        #region IHttpModule Members

        public void Dispose()
        {

        }

        public void Init(HttpApplication context)
        {

            context.BeginRequest += new EventHandler(context_BeginRequest);            
        }




        void context_BeginRequest(object sender, EventArgs e)
        {
            HttpContext context = ((HttpApplication)sender).Context;
            Page page = HttpContext.Current.CurrentHandler as Page;
            if (page != null)
            {
                string script = "/Scripts/jquery-1.5.1.js";
                if (page.Header != null)
                {
                    string scriptTag = String.Format("<script language=\"javascript\" type=\"text/javascript\" src=\"{0}\"></script>\n", script); page.Header.Controls.Add(new LiteralControl(scriptTag));
                }
                else if (!page.ClientScript.IsClientScriptIncludeRegistered(page.GetType(), script)) page.ClientScript.RegisterClientScriptInclude(page.GetType(), script, script);
            }


        }

        #endregion
    }

回答1:

The BeginRequest event is way too early to hook into a page. At that point in the request cycle, IIS/ASP.NET hasn't even decided to map your request to anything. So you should probably try something like the PostMapRequestHandler event.

However, that's not all there is to it: at that point the page (if there is one) hasn't executed yet. That happens right between the PreRequestHandlerExecute and PostRequestHandlerExecute events. So Pre... is too early, and Post... is too late. Your best bet is to hook a page event such as PreRenderComplete, and there execute your injection.

public void Init(HttpApplication context)
{
    context.PostMapRequestHandler += OnPostMapRequestHandler;
}

void OnPostMapRequestHandler(object sender, EventArgs e)
{
    HttpContext context = ((HttpApplication)sender).Context;
    Page page = HttpContext.Current.CurrentHandler as Page;
    if (page != null)
    {
        page.PreRenderComplete += OnPreRenderComplete;
    }
}

void OnPreRenderComplete(object sender, EventArgs e)
{
    Page page = (Page) sender;
    // script injection here
}

CAUTION: Few people still use them, but Server.Execute and Server.Transfer do not execute any pipeline events. So such child requests can never be caught using an IHttpModule.