Использование Fiddler для отладки AJAX в ASP.NET MVC - PullRequest
2 голосов
/ 28 января 2009

Я использую Fiddler для отладки приложения MVC и просмотра всех HTTP-запросов.

Приложение работает на http://localhost:51234/mvc

Поскольку любой, кто пытался использовать Fiddler для сайта, размещенного на localhost, знает, что существует проблема - Windows не будет перенаправлять трафик localhost через прокси, если вы нажмете эту ссылку напрямую. Вы можете обойти это несколькими способами , например, моим предпочтительным способом использования URL http://ipv4.fiddler:51234/aboutus/contact. Это прекрасно работает.

Проблема в том, что я начал делать AJAX, используя:

    <% using (Html.BeginForm()) { %>

Если вы просматриваете сгенерированный источник, он фактически сгенерировал это:

<form action="http://localhost:51234/aboutus/contact" method="post" onsubmit="Sys.Mvc.AsyncForm.handleSubmit(this, new Sys.UI.DomEvent(event), { insertionMode: Sys.Mvc.InsertionMode.replace, onFailure: Function.createDelegate(this, submitComments_failure), onSuccess: Function.createDelegate(this, submitComments_success) });">

Oops!

Сгенерировано localhost вместо ipv4.fiddler:51234. Поэтому, конечно, когда я запускаю запрос AJAX, Fiddler не видит его.

Теоретически использование имени машины должно работать, но WebDev.WebServer не будет отвечать, если вы попытаетесь напрямую нажать имя машины http://win-538lf:51234/aboutus/contact

[Fiddler] Подключение к win-538lf не удалось. исключение Текст: соединение не может быть установлено потому что целевая машина активно отказался fe80 :: 81fc: 8f0f: 457a: 27df% 12: 51234

Есть ли обходной путь для этого?

возможно ли настроить WebDev.WebServer для ответа на имя машины? Или мне придется создать виртуальный каталог или поддельный хост ? Я бы предпочел не делать этого, но я думаю, это не имеет большого значения.

Ответы [ 3 ]

2 голосов
/ 28 января 2009

Так что получается, что если вы используете эту перегрузку:

using (Ajax.BeginForm(new AjaxOptions()

вы получаете этот сгенерированный код (код, который «ломается»):

<form action="http://localhost:51234/aboutus/contact" method="post" 

но если вы сделаете это и включите имя действия:

using (Ajax.BeginForm("Contact", new AjaxOptions()

вы получите этот код сгенерированный:

<form action="Contact" method="post" 

Так что пока я в порядке, но приветствую любые другие решения.

1 голос
/ 28 января 2009

Вы пробовали расширение Firebug для Firefox? Он может показать запрос и ответ Ajax. Я использовал его с ASP.NET Ajax. Не уверен насчет MVC Ajax.

0 голосов
/ 28 января 2009

Вы можете написать HTTPModule , который использует фильтр ответов для манипулирования выводом HTML, заменяя все строки "localhost: 51234".

Класс HttpResponse имеет очень полезное свойство:

public Stream Filter {get; set;}

MSDN предоставляет полезное описание этого свойства:

"Получает или задает объект фильтра обтекания используется для изменения тела HTTP-объекта до передачи. "

Вот хорошая статья, в которой рассказывается, как это можно сделать: Реализация фильтра приложений IIS с использованием .NET HttpModules и фильтрации ответов (стр. 3)

Как описано в браузере объектов, Фильтр получает или устанавливает обертку объект фильтра, используемый для изменения HTTP тело субъекта перед передачей ». это это именно то, что нам нужно сделать для того, чтобы внести изменения в HTML вывод HttpHandler. Фильтр свойство объявлено как тип System.IO.Stream. Для того, чтобы назначить наш собственный класс для этого свойства фильтра нам нужно определить наш класс как наследование от System.IO.Stream:

public class PageFilter : System.IO.Stream

Теперь у нас есть класс Stream, PageFilter, который может быть назначен свойство Response.Filter. От прикрепление PageFilter к Свойство Response.Filter, PageFilter будут уведомлены в критические моменты как данные записываются в ответ буфер. Самое значительное событие Конечно, операция записи. когда этот метод называется, у вас будет возможность изменять данные, как это записывается в буфер ответов. (Я объединяю это с «Response. Buffer = true ', так что мой PageFilter получает полный поток ответов в вызов одного метода.):

public override void Write(byte[] buffer, int offset, int count)

В модуле HttpModule в начале запроса (я делаю это в OnBeginRequest) просто присоедините фильтр HTTP-ответов, назначив новый экземпляр Response.Filter:

httpCtx.Response.Filter = 
   new PageFilter(httpCtx.Response.Filter)

В этой статье показана полная реализация рабочего примера :

http://aspnetresources.com/articles/HttpFilters.aspx

Надеюсь, это поможет!

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