2013-06-20 2 views
25

У меня есть сайт ASP.NET MVC. Один из моих маршрутов - URL, который принимает 5 параметров. Для иллюстрации эти параметры называются parameter1, parameter2, parameter3, parameter4 и parameter5. В настоящее время я создаю URL-адрес в некотором C# коде, который будет POST действию mvc через WebClient. что код выглядит следующим образом:Отправить запрос POST на asp.net mvc action через Fiddler

WebClient myWebClient = new WebClient(); 
myWebClient.UploadStringCompleted += myWebClient_UploadStringCompleted; 

string url = "http://www.example.com/customer/" + parameter1 + "/orders/" + parameter2 + "/" + parameter3 + "/" + parameter4 + "/" + parameter5; 
myWebClient.UploadStringAsync(new Uri(url, UriKind.Absolute)); 

Я уверен, что метод UploadString делает POST. Мне нужно сделать POST, потому что мои значения параметров могут быть очень длинными. Фактически, я считаю, что иногда общая длина URL-адреса может составлять 20000 символов. Несмотря на это, я получаю 400 error, когда пытаюсь опубликовать свои данные. В попытке отладить это, я пытаюсь понять, как имитировать POST в Fiddler.

Предполагая, что передаю значения через строку запроса, как показано выше, какие значения я могу ввести в Fiddler? На вкладке Composer я не уверен, что ввести для области Request Headers. Я также не совсем уверен, что нужно вводить для URL. Я не уверен, помещаю ли я весь URL-адрес там, включая значения параметров, или если они принадлежат Request Headers.

Что мне нужно для ввода Fiddler, чтобы я мог отлаживать мою проблему?

+0

почему бы не написать крошечный C# клиента, ПОСТЫ к нему? Хотя я знаю только основы Fiddler – Jonesopolis

+0

Нет такой перегрузки 'UploadStringAsync', как вы показали в своем вопросе. Где вы передаете фактическую полезную нагрузку этого запроса POST? Также вы, похоже, упомянули некоторые параметры строки запроса в своем вопросе, но таких параметров нет. Ваши параметры, кажется, передаются как часть части пути URL-адреса. –

+1

_ «Чтобы отладить это, я пытаюсь понять, как имитировать POST в Fiddler». _ - вы также можете просто сообщить серверу об ошибке и проверить это. Или проверьте запрос, который делает ваша заявка. – CodeCaster

ответ

47

В принципе, все ваши параметры являются частью URL-адреса, и это корень вашей проблемы. Вот что происходит: вы нажимаете ограничение длины URL и получаете ошибку «400 Bad request». В реальном мире большинство веб-браузеров не работают с URL длиной более 2000 символов.

Для решения этой проблемы я предлагаю сделать немного рефакторинга, чтобы запрос был отправлен на адрес URL http://www.example.com/customer/parameter1/orders или даже http://www.example.com/customer/orders с параметрами отправки запроса. Вот как тест такой запрос в Скрипач:

  1. На Composer вкладке выберите POST запрос глаголом
  2. Укажите URL-адрес в качестве

    http://www.example.com/customer/parameter1/orders

    или

    http://www.example.com/customer/orders

  3. В Request Headers разделе вы можете установить заголовок типа содержимого, как

    Content-Type: application/x-www-form-urlencoded 
    

    или любого другого заголовок, может потребоваться. Или просто оставьте поле пустым, которое будет работать в вашем случае.

  4. Наконец в Request Body списке поля ваши параметры в запросе форме строки

    parameter1name=parameter1value&parameter2name=parameter2value 
    

В этом новом случае здесь, как вы можете отправить такой запрос, используя WebClient:

WebClient myWebClient = new WebClient(); 
myWebClient.UploadStringCompleted += myWebClient_UploadStringCompleted; 

string url = "http://www.example.com/customer/orders"; 
string data = "parameter1name=parameter1value&parameter2name=parameter2value"; 

myWebClient.UploadStringAsync(new Uri(url, UriKind.Absolute), data); 
+0

Затем, как мне обновить код WebClient, чтобы передать эту информацию в формате, который вы показываете? –

+0

@EelsFan, 'WebClient.UploadStringAsync' имеет перегрузку, которая принимает параметры в форме строки запроса. См. Обновление. – Andrei

+0

Я вижу обновление, теперь мне интересно, нужно ли мне обновлять свой маршрут. Мой маршрут в настоящее время route.MapRoute ( имя: «OrderInfo», url: «customer/{parameter1}/orders/{parameter2}/{parameter3}/{parameter4}/{parameter5}", defaults: new {controller = «Клиент», действие = «Заказчик»} ); –

6

I просто имитируйте точный запрос, который был отправлен.

Это, как я это делаю:

  1. Открыть Скрипач
  2. Перейти на страницу, которую я хочу переиздать команду т.е. повторить шаг черепашки, но следить за запрос в списке
  3. Выберите его из списка и щелкните правой кнопкой мыши, перейдите переигрывать> переиздание и редактировать
  4. Это построить реплицированную запрос, но попадает в точку останова перед отправкой (Вы увидите красную полосу справа)
  5. Выше это вы можете редактировать значения, которые были отправлены с помощью двойного щелчка на любом из них в заголовках, QueryString и т.д.
  6. Затем нажмите Выполнить Выполнения