【问题标题】:Subscribing to Application_BeginRequest订阅 Application_BeginRequest
【发布时间】:2014-10-06 16:12:34
【问题描述】:

有没有办法从 Global.asax 订阅 HttpApplication 的 BeginRequest 事件?

我想要做的是向 Global.asax 的 Application_Start 方法添加一行代码,然后它将订阅我拥有的对象到 BeginRequest 和 EndRequest 方法。

我知道这可以通过 HttpModules 来完成,但是由于各种原因我不能使用 HttpModules,我不会进入。

目的是能够将同一行代码添加到多个网站的 global.asax 页面。

【问题讨论】:

    标签: asp.net


    【解决方案1】:

    我做了更多的挖掘工作,发现 Init 方法是适合我的方法。我不相信 Global.asax 构造函数或 Application_Start 方法是要走的路。根据 MS 文档:

    您应该在应用程序启动期间只设置静态数据。不要设置任何实例数据,因为它只对创建的 HttpApplication 类的第一个实例可用。

    我将其解释为:“不要在此处注册活动,因为它在第一次请求后将不可用。”

    在创建所有模块后,为 HttpApplication 类的每个实例调用一次 Init 方法。

    我将其解释为:“在此处注册您的事件,因为它将为应用程序的每个新实例注册,并且不会删除处理程序”。

    这里的关键是“在创建所有模块之后”。构造函数在此之前被调用,所以不会是正确的地方。至于 Application_Start,我尝试了很多次,但我无法让事件注册保持不变 - 文档证明了这一点。

    所以我尝试将代码添加到 Init 方法中,它工作得很好 即

    public void Init()
    {
        this.BeginRequest += attach your handler here;
        this.EndRequest += attach your other handler here;
    }
    

    【讨论】:

    • 在你的 Init 函数中,sender 变量来自哪里?
    • @billy,我修复了帖子,我一定犯了一些或其他复制粘贴错误
    【解决方案2】:

    我有

    Sub Application_BeginRequest(ByVal sender As Object, ByVal e As EventArgs)
        'Put your code here
    End Sub
    

    在 Global.asax.vb (Class [Global]) 中,它可以工作。

    但是,您需要调用其他类的方法。为此,需要为BeginRequest' inGlobalNew` 添加处理程序。

    例子:

    班级:

    Public Class MyHandlers
      Public Shared Sub MyCode(sender As Object, e As System.EventArgs)
        HttpContext.Current.Response.Write(HttpContext.Current.Request.Path)
      End Sub
    
     End Class
    

    Global.asax.vb:

    Public Class Global_asax
       Inherits System.Web.HttpApplication
    
       Public Sub New()
         MyBase.New()
         AddHandler Me.BeginRequest, AddressOf MyHandlers.MyCode
       End Sub
    
     Rem ....
    
     End Class
    

    【讨论】:

    • 我将代码放在您建议的位置,但由于某种原因,我的事件从未被触发。
    • 我创建了新的 ASP.NET 应用程序项目(visual basic),打开 Global.asax.vb,找到Sub Application_BeginRequest,在里面放一个断点并运行。断点被击中。可以试试吗?
    • Application_BeginRequest 被触发,这不是问题所在。问题是当 Application_BeginRequest 被调用时我不能从另一个类中触发代码而不将代码放在那里。关键是我不想将我的代码复制到 Application_BeginRequest
    • 我已经修改了我的回复。我希望现在它是您所需要的。
    • 好的,您正在向 Global.asax 的构造函数添加代码。我不知道这样做有什么影响,但似乎它会起作用。谢谢你
    【解决方案3】:
     public void Application_Start( object sender, EventArgs e )
     {
         HttpApplication app = (HttpApplication)sender;
    
         app.BeginRequest += attach your handler here;
         app.EndRequest += attach your other handler here;
     }
    

    【讨论】:

    • 我也试过这个,但如上所述,我的代码没有被执行。我需要做更多的挖掘,但是谢谢
    • 我有一个带有 Init 方法的类,它以 HttpApplication 作为参数。在 Init 方法中,它执行以下操作: > BeginRequest += 和 > EndRequest += 代码模块)重定向到类中的方法。当我在 Global.asax 的 Application_Start 中创建该类的新实例并调用 Init 时,它会进行连接,但我认为连接并不成功,因为从未调用过代表。 IvanH 有一个答案,但我不相信把东西放在 Gloal.asax 中是安全的......
    • 对我来说同样的经历。该方法没有被执行。
    猜你喜欢
    • 2020-10-17
    • 1970-01-01
    • 2019-12-29
    • 2019-01-03
    • 2020-03-29
    • 2020-10-11
    • 1970-01-01
    • 1970-01-01
    • 2015-08-24
    相关资源
    最近更新 更多