Нечетное поведение HttpRequest - PullRequest
1 голос
/ 26 марта 2010

У меня есть веб-сервис, который работает с классом HttpHandler. В этом классе я проверяю поток запросов на параметры формы / строки запроса. В некоторых обстоятельствах казалось, что эти параметры не проходят. Немного покопавшись, я натолкнулся на поведение, которое мне не совсем понятно. Смотрите ниже:

// The request contains 'a=1&b=2&c=3'
// TEST ONLY: Read the entire request
string contents;
using (StreamReader sr = new StreamReader(context.Request.InputStream))
{
    contents = sr.ReadToEnd();
}
// Here 'contents' is usually correct - containing 'a=1&b=2&c=3'. Sometimes it is empty.

string a = context.Request["a"];

// Here, a = null, regardless of whether the 'contents' variable above is correct

Может кто-нибудь объяснить мне, почему это может происходить? Я использую .NET WebClient и UploadDataAsync для выполнения запроса на клиенте, если это имеет значение.

Если вам нужна дополнительная информация, пожалуйста, дайте мне знать.

1 Ответ

0 голосов
/ 26 марта 2010

Почему вы проверяете поток запросов на параметры строки запроса? В .Net существует множество встроенных типов для работы с HTTP-запросами. Вы можете легко получить правильную коллекцию NameValueCollection из строки запроса с помощью следующего кода:

NameValueCollection queryStringValues =
    HttpUtility.ParseQueryString(HttpContext.Current.Request.Query.ToLower());

string value = queryStringValues["my_key"];

В вашем коде вы StreamReader читаете поток и присваиваете его строковой переменной с именем contents. Однако, когда вы присваиваете значение строке a, вы получаете доступ к переменной с именем context, которая, как я полагаю, действительно HttpContext.Current. Затем вы используете объект Request как NameValueCollection. Когда вы получаете доступ к коллекции Request, она ищет параметры POST и GET, проверяя Request.Form и Request.QueryString.

Если что-то дальше по конвейеру HTTP-запросов не изменит запрос по маршруту, вы не потеряете параметры. Используйте прокси-инструмент, такой как Fiddler или Charles , чтобы проверить запрос, когда он покидает браузер.

...