2 Stimmen

Verwendung von Fiddler zum Debuggen von AJAX in ASP.NET MVC

Ich verwende Fiddler, um meine MVC-Anwendung zu debuggen und alle HTTP-Anfragen zu sehen.

Die Anwendung läuft auf http://localhost:51234/mvc

Jeder, der schon einmal versucht hat, Fiddler für eine auf localhost gehostete Website zu verwenden, weiß, dass es ein Problem gibt - Windows leitet den localhost-Verkehr nicht über den Proxy weiter, wenn Sie diesen Link direkt anklicken. Sie können dieses Problem umgehen in mehrere Möglichkeiten wie z. B. die von mir bevorzugte Art der Verwendung der URL http://ipv4.fiddler:51234/aboutus/contact . Das funktioniert hervorragend.

Das Problem war, dass ich anfing, AJAX mit :

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

Wenn Sie sich den generierten Quelltext ansehen, hat er tatsächlich dieses :

<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) });">

Huch!

Sie erzeugte localhost anstelle von ipv4.fiddler:51234 . Wenn ich also die AJAX-Abfrage ausführe, sieht Fiddler sie natürlich nicht.

Theoretisch sollte die Verwendung des Rechnernamens funktionieren, aber der WebDev.WebServer antwortet nicht, wenn Sie versuchen, den Rechnernamen direkt einzugeben http://win-538lf:51234/aboutus/contact

[Fiddler] Verbindung zu win-538lf ist fehlgeschlagen. Exception Text: Es konnte keine Verbindung hergestellt werden weil der Zielcomputer sie aktiv verweigert hat fe80::81fc:8f0f:457a:27df%12:51234

Gibt es eine Lösung für dieses Problem?

Ist es möglich, WebDev.WebServer so zu konfigurieren, dass er auf den Rechnernamen reagiert? Oder muss ich ein virtuelles Verzeichnis erstellen oder falscher Gastgeber ? Ich würde es vorziehen, das nicht zu tun, aber ich denke, es ist keine große Sache.

2voto

Simon_Weaver Punkte 129442

Es stellt sich also heraus, dass, wenn Sie diese Überladung verwenden :

using (Ajax.BeginForm(new AjaxOptions()

wird dieser Code generiert (der Code, der "bricht"):

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

aber wenn Sie dies tun und den Namen der Aktion angeben:

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

erhalten Sie diesen Code generiert:

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

Damit bin ich vorerst zufrieden, würde aber andere Lösungen begrüßen.

1voto

davogones Punkte 7271

Haben Sie die Firebug-Erweiterung für Firefox ausprobiert? Sie kann die Ajax-Anfrage und -Antwort anzeigen. Ich habe es mit ASP.NET Ajax verwendet. Nicht sicher über MVC Ajax.

0voto

splattne Punkte 102178

Sie könnten eine HTTPModul die eine Reaktionsfilter um die HTML-Ausgabe zu manipulieren und alle "localhost:51234"-Strings zu ersetzen.

Die Klasse HttpResponse hat eine sehr nützliche Eigenschaft:

public Stream Filter {get; set;}

MSDN bietet eine hilfreiche Beschreibung dieser Eigenschaft:

"Liest oder setzt ein Wrapping-Filter-Objekt das verwendet wird um den HTTP Entity Body zu modifizieren vor der Übertragung zu modifizieren."

Hier ist ein schöner Artikel, der einige Hintergrundinformationen dazu gibt, wie Sie dies tun können: Implementieren eines IIS-Anwendungsfilters mit .NET-HttpModulen und Antwortfilterung (Seite 3)

Wie im Objektbrowser beschrieben, erhält oder setzt der Filter ein Wrapping Filterobjekt ab, das zur Modifizierung des HTTP Entitätskörper vor der Übertragung zu modifizieren. Diese ist genau das, was wir tun müssen, um um Änderungen an der HTML-Ausgabe des Ausgabe des HttpHandlers vorzunehmen. Die Eigenschaft Filter Eigenschaft ist deklariert als Typ System.IO.Stream. Um dieser Filter-Eigenschaft eigene Klasse dieser Filter-Eigenschaft zuzuweisen, müssen wir unsere Klasse als die von System.IO.Stream erbt:

public class PageFilter : System.IO.Stream

W PageFilter, die der Eigenschaft Response.Filter zugewiesen werden kann. Eigenschaft Response.Filter zugewiesen werden kann. Durch Anhängen von PageFilter an die Response.Filter-Eigenschaft, wird PageFilter zu kritischen Zeiten benachrichtigt werden, wenn Daten in den Antwortpuffer geschrieben werden Puffer geschrieben werden. Das wichtigste Ereignis ist natürlich der Schreibvorgang. Wenn diese Methode aufgerufen wird, haben Sie die Möglichkeit, Daten zu ändern, während sie in den Antwortpuffer geschrieben werden. (Ich kombiniere dies mit 'Response.Buffer = true', so dass mein PageFilter den kompletten Antwortstrom in einem einem einzigen Methodenaufruf erhält.):

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

Im HttpModule fügen Sie zu Beginn der Anforderung (ich tue es in OnBeginRequest) einfach Ihren HTTP-Antwortfilter hinzu, indem Sie Response.Filter eine neue Instanz zuweisen:

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

Dieser andere Artikel zeigt eine vollständige Arbeitsbeispiel für die Umsetzung :

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

Ich hoffe, das hilft!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X