Можно ли прочитать строку запроса в ASP.NET-MVC при нажатии / mysite? Q = 123 - PullRequest
3 голосов
/ 26 марта 2009

У меня есть сайт, на который ссылаются внешние сайты с идентификатором кампании

http://www.example.com? Cid = 123

или (с косой чертой)

http://www.example.com/?cid=123

В случае, если вы пропустите слеш, большинство браузеров добавят его для вас. Таким образом, в любом случае, какой бы адрес вы ни указали, мое приложение попало на второй адрес выше. Параметр QueryString всегда доступен.

Я заметил, что с маршрутизацией ASP.NET MVC (может быть, даже без), когда я использую виртуальный каталог, я не получаю такое же поведение.

Например, если у меня есть 'http://www.example.com/virtualdirectory?cid=123', это достигнет моей страницы 'default.aspx' (так как она не соответствует ни одному маршруту). НО, когда я проверяю значение Request.QueryString, оно пустое. Если перейти к 'http://www.example.com/virtualdirectory?cid=123', тогда в объекте Request присутствует значение QueryString.

Если я добавлю точку останова в Default.aspx.cs во вновь созданном проекте MVC (окончательная версия MVC 1.0 - март 2009 г.), тогда я не увижу параметры запроса.

Мне было интересно, есть ли какой-нибудь способ получить доступ к этим параметрам в IIS6 и / или IIS7, если пользователь обращается к виртуальному каталогу с помощью URL-адреса, например /virtualdirectory?cid=123.

Возможно, не будет никакого решения, но я просто рад, что заметил это, прежде чем связать каких-либо партнеров в виртуальный каталог!

Ответы [ 5 ]

1 голос
/ 05 апреля 2009

Некоторые ответы не понимают проблему. Если вы поместите свое приложение в виртуальный каталог, просмотр «http://www.example.com/virtualdirectory?cid=123' против» http://www.example.com/virtualdirectory/?cid=123' будет иметь другое поведение.

Я только что попробовал это с помощью сервера разработки Visual Studio и смог воспроизвести проблему.

Похоже, это не имеет никакого отношения к тому, есть ли у вас аргумент в отношении метода Index HomeController.

Мне кажется, что веб-сервер переписывает / virtualdirectory? Cid = 123 в /virtualdirectory/default.aspx? до того, как asp.net получит в свои руки запрос.

1 голос
/ 04 апреля 2009

http://www.example.com? Чид = 123

это легко с MVC. в вашем HomeController, который создан для вас, добавьте атрибут метода к вашему Index() методу String cid. как это:

        public ActionResult Index(string cid)
    {

Поскольку это строка, ее можно игнорировать, поэтому, если вы запросите только "http://www.example.com",, cid будет null. Я только что проверил это на одном из своих сайтов значение передается при добавлении косой черты и без.

1 голос
/ 26 марта 2009

Один из возможных обходных путей - я не уверен, что назвал бы это решением - заключался бы в создании правила перезаписи в IIS 7 или в переписывающем устройстве для IIS 6, чтобы вернуть косую черту для вас.

0 голосов
/ 05 апреля 2009

Ваша ссылка должна иметь вид http://www.example.com/123

и поскольку вы используете метод действия «Индекс» в контроллере «Домашний», метод индекса по умолчанию позаботится об этом

public ActionResult Index(int id){}

Если быть точным, вы можете использовать атрибут AcceptVerbs, как этот

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index(int id){}

Карта маршрутов по умолчанию должна обрабатывать ваш запрос, если вы хотите добавить дополнительные параметры строки запроса, такие как http://www.example.com/?cid=123&aid=456&bid=789, затем добавить отдельную карту маршрутов для обработки этого URL-адреса и соответственно изменить метод действия

0 голосов
/ 04 апреля 2009

Что вы получите, когда попытаетесь получить доступ к необработанному URL-адресу с помощью переменных сервера IIS, в частности, переменной HTTP_URL?

http://msdn.microsoft.com/en-us/library/ms524602.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...