2010-02-22 2 views

ответ

110

Я рекомендую Request.QueryString["key"]. Нет большой разницы в Request["Key"] для строки запроса, но есть большая разница (er), если вы пытаетесь получить значение от ServerVariables. Request["Key"] ищет значение в QueryString если null, то он выглядит Form, затем Cookie и, наконец, ServerVariables.

Использование Params является самым дорогостоящим. Первый запрос к параметрам создает новый NameValueCollection и добавляет каждый из QueryString, Form, Cookie и ServerVariables к этой коллекции. Второй запрос на него более эффективен, чем Request["Key"].

Сказав, что разница в производительности для пары ключей довольно небрежна. Ключ здесь - это код, который должен показывать намерение, а использование Request.QueryString дает понять, каковы ваши намерения.

+4

+1 для того, чтобы вдаваться в детали и сделать смысл. – Phil

+0

Спасибо, вы просто ответили на мой вопрос о том, почему значения cookie выходят из моего запроса.Params [index]. – ProfK

+0

Отлично, что вы отметили, что новый NameValueCollection создается на первый звонок, теперь моя ошибка и трассировка стека имеют смысл :) – SwissCoder

4

Я всегда четко указываю коллекцию. Если по какой-то причине вы хотите разрешить переопределения, код «получить» для каждого из них и написать четкий код, который показывает вашу иерархию для выбора одного над другим. IMO, мне не нравится получать ценность из нескольких источников без четкой бизнес-причины для этого.

21

Я предпочитаю использовать Request.QueryString["key"], потому что он помогает знать код точно, откуда вы получаете данные. Я не хочу использовать Request.Params["key"], потому что он может ссылаться на файл cookie, строку запроса и несколько других вещей; поэтому пользователю нужно немного подумать. Чем меньше времени кому-то нужно выяснить, что вы думаете, тем легче поддерживать код.

+1

Я думаю, что проблема действительно «где» данные поступают. Хорошо использовать 'Request.Params [" key "]', пока вам наплевать, выходит ли он из строки запроса или откуда-то еще. –

+0

Если вы знаете, какая коллекция содержит значение, посмотрите там. Без использования объекта Request искать все коллекции (по соображениям производительности, если ничего другого). – DaveB

+0

@Will Vousden. Хороший момент. Ваша точка зрения очень верна, когда вы впервые пишете код, и идея свежа в вашей голове. Быстрая перемотка вперед через два года - у вас неприятная ошибка, код очень волосатый/сложный, и вы просто хотите сосредоточиться на устранении проблемы! Не нужно делать охоту за значением переменной, заполненной «Запросом».Params ["key"] "(строка запроса, переменная сеанса или что-то еще) могут сделать вещи немного проще. Это не огромная или незаметная, и вы всегда можете ее найти, но такие мелочи долго – Phil

6

HttpRequest.Params или Request.Params получает почти все (строки запроса, формы, печенье и переменные сеанса) от HTTPRequest, в то время как Request.Querystring только потянет ... все строки запроса зависит от того, что вы делаете в данный момент.

0

Как любезно уведомление, если вы установите requestValidationMode = "4,5" под web.config, как Request.QueryString [ «ключ»] и Request [ «ключ»] будут использовать "ленивую загрузку" поведение как дизайн.

Однако, как-то Request.Params ["key"] по-прежнему вызывает проверку как поведение 4.0.

Это странное поведение действительно смущает меня в течение длительного времени.