#.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. Запрос. Пробное тестирование — единственный случай, который я могу придумать, когда они могут отличаться.