Разница между HttpContext.Request и Request

В чем разница между тремя объектами ASP.NET:

  • HttpContext.Current.Request
  • HttpContext.Request
  • Запрос

Являются ли они такими же?

Изменить 1

Ведут ли эти объекты по-разному внутри global.asax/global.asax.vb и default.aspx/default.aspx.vb.

Изменить 2

OK На этот раз постараюсь быть конкретным. Какое из следующего следует использовать:

' 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

Ответы

Ответ 1

Ну:

  • HttpContext.Current - это статическое свойство, возвращающее текущий HttpContext для потока
  • HttpContext.Request - это свойство экземпляра, возвращающее HttpRequest для HttpContext, которое вы вызываете его
  • Page.Request является свойством экземпляра в Page, возвращая Request, связанную со страницей, на которую вы его вызываете (обычно неявно this)

Итак, HttpContext.Current.Request будет использовать оба из первых двух свойств, чтобы получить запрос, связанный с текущим потоком. Если вы находитесь в потоке, обрабатывающем запрос, это будет таким же, как Page.Request на соответствующей странице, которая отображается.

Однако, если ваш рендеринг запускает другой поток, код, запущенный в другом потоке, все равно может попасть в Request через Page.Request (потому что это просто нормальное свойство), но не будет HttpContext связанный с потоком - поэтому HttpContext.Current.Request не будет работать.

EDIT: для ответа на редактируемый вопрос в global.asax свойство Request ссылается на HttpApplication.Request, и, вероятно, это лучший подход к использованию. HttpContext.Request не будет работать, поскольку он пытается получить доступ к статическому свойству, как если бы он был свойством экземпляра. HttpContext.Current.Request должен работать, предполагая, что контекст связан с потоком этой точки.

Ответ 2

Они все одинаковые. Существуют просто различные ярлыки, встроенные в классы, которые вы наследуете, например, Controller и Page.