Получить полную строку запроса в C # ASP.NET

79

Как программист PHP я привык использовать $ _GET для получения строки HTTP-запроса ... и если мне нужна вся строка, есть множество способов сделать это.

Однако в ASP я не могу получить запрос.

Вот код для news.aspx (встроенный в некоторый HTML):

<%                             
    string URL = "http://www.example.com/rendernews.php?"+Request.Querystring;
    System.Net.WebClient wc = new System.Net.WebClient();
    string data = wc.DownloadString(URL);
    Response.Output.Write(data);
%>

Я получаю вывод PHP-скрипта с удаленного сервера, и он отлично работает без Request.Querystring.

Проблема в том, что я пытаюсь получить полную строку запроса в первой строке: Request.Querystring. Я получаю сообщение об ошибке « Ссылка на объект не указана на экземпляр объекта », что в основном означает, что Request.Querystring не существует.

Есть идеи, в чем проблема? Как я могу получить эту строку запроса, чтобы при вызове index.aspx типа http://test.com/news.aspx?id=2 мой скрипт извлекал http://www.example.com/rendernews.php?id=2

Энтони Карти
источник
Всегда ли он терпит неудачу или есть крайние случаи, такие как отсутствие определенных переменных get?
Мэтт,

Ответы:

191

Попробуйте, Request.Url.Queryесли вам нужна необработанная строка запроса в виде строки.

Nitzmahone
источник
16

Это должно сработать для вас.

Напишите этот код в Page_Loadслучае страницы.

string ID = Request.QueryString["id"].ToString();
Response.Redirect("http://www.example.com/rendernews.php?id=" + ID);
Навид Батт
источник
8

Request.QueryStringвозвращает вам коллекцию пар ключ / значение, представляющую строку запроса. Не строка. Однако не думайте, что это вызовет ошибку ссылки на объект. Причина, по которой вы это получаете, заключается в том, что, как указал Мауро в комментариях. Это QueryString, а не Querystring.

Пытаться:

Request.QueryString.ToString();

или же

<%                                 
    string URL = Request.Url.AbsoluteUri 
    System.Net.WebClient wc = new System.Net.WebClient();
    string data = wc.DownloadString(URL);
    Response.Output.Write(data);
%>

То же, что и ваш код, но Request.Url.AbsoluteUriвернет полный путь, включая строку запроса.

Дэмиен
источник
При этом я получаю: «'System.Web.HttpRequest' не содержит определения для 'Querystring' и никакого метода расширения 'Querystring', принимающего первый аргумент типа 'System.Web.HttpRequest'», и когда я пытаюсь добавить System. Web перед этим я получаю «Тип или имя пространства имен 'Request' не существует в пространстве имен 'System.Web' (вам не хватает сборки?)»
Энтони Карти
Возможно, вы захотите убедиться, что вы где-то не переопределяете Request. У меня есть что-то, использующее Request.Querystring [.ToString ()] в производстве, и оно работает безупречно.
Мэтт
2
Разве это не QueryString, а не Querystring? приведенный выше код выглядит как C # - помните о чувствительности к регистру
Мауро
1
В моем случае это именно то, чего я хочу избежать, потому что ToString () содержит ошибки в **** старой версии .NET framework, которую я вынужден использовать.
Флориан Винтер,
1

Просто используйте, Request.QueryString.ToString()чтобы получить полную строку запроса, например:

string URL = "http://www.example.com/rendernews.php?"+Request.Querystring.ToString();
terR0Q
источник
1
Это возвращает имя класса.
Аллов
1
@Allov Я тестировал это, и он вернул строку запроса правильно, и на самом деле даже без .ToString () он будет работать при объединении со строкой
yoel halb
Это не работало в .Net 4. Возможно, это проголосовало за другие версии .Net.
Fabio Milheiro
1
Фактически это меняется & для & amp; поэтому он делает его непригодным для использования. Request.Url.Query намного лучше.
Jiří Herník
0

Я проверил ваш пример, и хотя Request.QueryString не может быть преобразован в строку, ни неявную, ни явную, метод .ToString () возвращает правильный результат.

Более того, при объединении со строкой с использованием оператора «+», как в вашем примере, он также вернет правильный результат (поскольку это ведет себя так, как если бы был вызван .ToString ()).

Таким образом, в вашем коде нет ничего плохого, и я бы предположил, что ваша проблема возникла из-за опечатки в вашем коде, написавшей «Querystring» вместо «QueryString».

И это имеет больше смысла с вашим сообщением об ошибке, поскольку, если проблема в том, что QueryString является коллекцией, а не строкой, ему придется выдать другое сообщение об ошибке.

Йоэль Халб
источник
-1

всего мгновение назад я столкнулся с той же проблемой. и я разрешаю это следующим образом.

Response.Redirect("../index.aspx?Name="+this.textName.Text+"&LastName="+this.textlName.Text);

со ссылкой на это

user2147280
источник
1
Никогда и никогда не создавайте такие URL-адреса ни в каком фреймворке или языке программирования. Используйте построители URL. Они позаботятся о кодировании за вас, чего не делает приведенный выше код.
Флориан Винтер,