2009-01-28 94 views
2

我正在使用Fiddler來調試我的MVC應用程序並查看所有HTTP請求。使用Fiddler在ASP.NET MVC中調試AJAX

的應用程序在http://localhost:51234/mvc

正如任何人誰曾試圖使用Fiddler託管在localhost網站知道有運行是一個問題 - 窗口將通過代理不轉發本地主機的流量,如果你直接打這個鏈接。你可以在several ways中解決這個問題,比如我最喜歡的使用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) });">

糟糕!

它生成localhost而不是ipv4.fiddler:51234。所以當然,當我運行AJAX查詢Fiddler沒有看到它。

理論上使用機器名應該工作,但是如果你嘗試打直接在機器名WebDev.WebServer不會響應http://win-538lf:51234/aboutus/contact

[提琴手]連接到 雙贏538lf失敗。異常 文本:無連接可以作出 因爲目標機器積極 拒絕它 FE80 :: 81fc:8f0f:457A:27df%12:51234

對此有一個解決方法嗎?

是否可以配置WebDev.WebServer來響應機器名稱?或者我將不得不創建一個虛擬目錄或fake host?我不想這樣做,但我想這不是什麼大不了的事。

+0

我想你需要調試IE嗎?你有沒有在Firefox中試過Firebug的網絡標籤? – splattne 2009-01-28 07:48:37

+0

@splattne - 實際上我現在在Chrome中工作。試圖決定哪個非ie瀏覽器給我最好的調試體驗。鉻只是失去了一個點因爲它完全崩潰(所有制表符!)當我試圖調試 – 2009-01-28 10:10:08

回答

1

您是否試過Firefox的Firebug擴展?它可以顯示Ajax請求和響應。我用它與ASP.NET Ajax。不確定MVC Ajax。

0

你可以寫一個的HttpModule它採用了響應濾波器以操縱HTML輸出替換所有的「本地主機:51234」字符串。

的HttpResponse對象類有一個非常有用的性質:

public Stream Filter {get; set;} 

MSDN提供該屬性的一個有用的描述:

「獲取或設置用於修改HTTP實體包裹過濾器對象 傳輸前身體 。「

這裏是一個很好的文章,其給出了一些背景,你怎麼可以這樣做:Implementing an IIS Application Filter Using .NET HttpModules and Response Filtering (page 3)

作爲對象瀏覽器描述, 過濾器獲取或設置用於修改包裝 過濾器對象HTTP entity body before the transmission'。這個 正是我們需要按照 來修改HttpHandler的輸出HTML 。Filter 屬性聲明爲 System.IO.Stream。爲了 我們自己的類分配給這個過濾器屬性 我們需要定義我們班 從System.IO.Stream繼承:

public class PageFilter : System.IO.Stream 

我們現在有一個Stream類, 的PageFilter,可以將其分配給 的Response.Filter屬性。通過 將PageFilter附加到 Response.Filter屬性中,PageFilter 將在關鍵時間通知爲 數據寫入響應 緩衝區。 當然最重要的事件是寫入操作。當 調用此方法時,您將有 修改數據的機會,因爲它將 寫入響應緩衝區。 (I結合這與「將Response.Buffer =真」,使我的PageFilter接收在 單個方法調用中的完整的響應流。):

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

在HTTP模塊,在開始時請求(我做在OnBeginRequest)的只需到Response.Filter分配一個新的實例附上您的HTTP響應濾波器:

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

這另一篇文章顯示了一個完整工作示例實現

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

我希望這有助於!

2

所以,事實證明,如果你使用此重載:你得到產生

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" 

所以我現在很好,但會歡迎任何其他解決方案。