HttpContext.Request和Request之间的区别

Sal*_*n A 14 .net asp.net

三个ASP.NET对象之间有什么区别:

  • HttpContext.Current.Request
  • HttpContext.Request
  • 请求

这些完全一样吗?

编辑1

这些对象在global.asax/ global.asax.vbdefault.aspx/ 内的行为是否不同default.aspx.vb.

编辑2

好的,这次我会尝试具体.我应该使用以下哪一项:

' File: global.asax
Protected Sub Application_BeginRequest(ByVal sender As Object, ByVal e As System.EventArgs)
    If Request.Url.Port = 80 Then
    'If HttpContext.Current.Request.Url.Port = 80 Then
    'If HttpContext.Request.Url.Port = 80 Then
        'do something
    End If
End Sub

' File: default.aspx
Public Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
    If Request.Url.Port = 80 Then
    'If HttpContext.Current.Request.Url.Port = 80 Then
    'If HttpContext.Request.Url.Port = 80 Then
        'do something
    End If
End Sub
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 28

好:

  • HttpContext.Current是一个静态属性,返回HttpContext线程的当前值
  • HttpContext.Request是一个实例属性,返回HttpRequestHttpContext您调用它
  • Page.Request是一个实例属性Page,返回Request与您调用它的页面关联(通常是隐式this)

因此,HttpContext.Current.Request将使用前两个属性以获取与当前线程关联的请求.如果您在处理请求的线程中,那将与Page.Request正在呈现的相关页面内的相同.

但是,如果你的渲染启动了另一个线程,那么在另一个线程中运行的代码仍然可以获取Request通道Page.Request(因为它只是一个普通的属性)但是没有HttpContext与该线程关联 - 所以HttpContext.Current.Request不会起作用.

编辑:要回答编辑过的问题,在global.asax中Request属性引用HttpApplication.Request,并且可能是最好的使用方法.HttpContext.Request将无法工作,因为它试图访问静态属性,就好像它是一个实例属性.HttpContext.Current.Request 应该工作,假设上下文已经与该点相关联.