Разница между HttpContext.Request и запросом

#.net #asp.net

#.net #asp.net

Вопрос:

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

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

Это точно то же самое?

Редактировать 1

Ведут ли себя эти объекты по-разному внутри global.asax / global.asax.vb и default.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
  

Комментарии:

1. Проверьте, все ли они равны! HttpContext.Current доступен при написании кода в Global.asax.cs, но другие недоступны.

2. @Jani: Я действительно хочу знать, как эти три ведут себя внутри global.asax , global.asax.vb , default.aspx и default.aspx.vb .

Ответ №1:

Ну:

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

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

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

РЕДАКТИРОВАТЬ: Чтобы ответить на отредактированный вопрос, в global.asax Request свойство ссылается на HttpApplication.Request , и, вероятно, это наилучший подход к использованию. HttpContext.Request не сработает, потому что это попытка получить доступ к статическому свойству, как если бы это было свойство экземпляра. HttpContext.Current.Request должно сработать, предполагая, что к этому моменту контекст был связан с потоком.

Комментарии:

1. 1 — Это было полезно. Просто любопытно, почему .Request не отображается в Visual Studio как свойство HttpContext . (например, если вы создаете экземпляр HttpContext , intellesense не покажет вам Request как свойство.)

2. @Joel: Понятия не имею … это должно сработать, я бы ожидал. Компилируется ли один и тот же код, когда вы просто вводите его вручную?

3. @Jon: Я отредактировал свой вопрос. Пожалуйста, ознакомьтесь с этим, спасибо. @Joel: та же проблема с intellisense.

4. @Jon — Нет. (Я думаю, вы ответили на «плохую» версию моего комментария о том, что я случайно отправил его до того, как это было сделано. Смотрите редактирование.) Также не отображается в экземплярах HttpContext . например, HttpContext x = null; VS следует рассматривать x как экземпляр HttpContext , насколько это касается intellesense. Кроме того, также не отображается Request в обозревателе объектов.

5. @Jon — Я могу обобщить это и выделить в отдельный вопрос. Я сталкивался с подобными вещами раньше.

Ответ №2:

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

Комментарии:

1. Ясность: запрос — это прямой указатель на HttpContext.Request. HttpContext указывает на ControllerContext.HttpContext, который в «обычных» случаях является HttpContext.Current. Запрос. Пробное тестирование — единственный случай, который я могу придумать, когда они могут отличаться.