這可能需要一些時間來解釋,但在這裏我去:)。控制器操作多次觸發 - 在Azure模擬器中運行的ASP.NET MVC 4應用程序
我創建了兩個的Visual Studio 2012項目:
- 使用A項目(網絡 - > ASP.NET MVC 4 Web應用程序)在Visual Studio中的模板添加項目對話框。我沒有添加單元測試項目。
- 使用Azure雲服務模板(雲 - > Windows Azure雲服務)的項目。我添加了一個角色,一個ASP.NET MVC 4 Web角色,並且再次沒有添加單元測試項目。
這兩個項目完全不受Visual Studio爲我創建它們的方式的影響。
對於每個項目,然後我去了HomeController
類,並在每個About
和Contact
動作方法(無聊的動作,只是返回一個視圖)設置一個斷點。例如,我在方法的唯一一行上設置了一個斷點:
public ActionResult About()
{
return View();
}
然後我開始調試第一個項目(非Azure項目)。一切都如預期的那樣 - 即當我使用瀏覽器在About和Contact頁面之間導航時,相應操作方法中的斷點將在每個請求中被命中一次。對我來說似乎很好。
然後我開始調試Azure項目。我遵循在About和Contact頁面之間導航的相同過程。這次我發現了有趣的非確定性行爲。在某些請求中,操作方法中的斷點將在頁面呈現之前多次(有時超過兩次)命中。有時候,請求會掛起,頁面不會呈現(即使等待幾分鐘後)。
我想知道爲什麼會發生這種情況,因爲它正在影響我們正在處理的另一個Azure MVC應用程序中更復雜的事情(例如,由於此問題,應用程序可能會嘗試創建兩個或更多的一個請求的數據庫中的模型對象)。
我在以下環境:
- 的Windows 8專業版(64位)
- 的Visual Studio 2012旗艦版
- 的Windows Azure SDK爲Visual Studio 2012
- IIS 8個快遞
- 火狐瀏覽器與螢火蟲(也證實了使用IE的行爲)
- SQL Server 2012(不真正相關,我猜)
,我注意到的是,以下警告消息,在Visual Studio中的輸出窗口時,每當我調試Azure項目的唯一有趣的事情:
在重映私有端口80〜81角色'My_Web_Role_Name'來避免模擬期間的衝突。
也許這種重映射與它有關。然後再做一次netstat -ano
之後,我看到Azure Development Fabric進程正在偵聽端口80,所以也許這就是爲什麼它需要重新映射...聽起來不錯。
無論如何,我希望有人可能有什麼可能會導致此行爲的想法。這裏有一些加分和方法我試過:
- 重置IIS,重新啓動Azure計算/存儲模擬器,重新啓動整個機器
- 地帶的所有腳本的意見(即行爲仍然存在,如果頁面只是有一個基本的HTML段落)
- 我試圖找到相關的IIS Express日誌文件,但似乎Azure項目不像其他項目那樣運行IIS Express(是否正確?)。
- 我監視了Azure計算模擬器控制檯...在那裏沒有什麼非常有趣的。
所以......終於,一些問題:
- 可別人重現此問題?
- Azure模擬器生成的任何其他日誌可能會幫助我嗎?
我真的很感激在這裏正確的方向推動:)。
乾杯!
編輯
這裏的一些信息(我更新了這個問題,因爲我繼續調試這個問題):
我決定運行無需調試的解決方案,我把一些簡單的同時在About
和Contact
動作方法調試信息,例如:
public ActionResult About()
{
System.IO.File.AppendAllText(@"c:\Logs\azure.log", DateTime.Now + ": Contact, thread " + System.Threading.Thread.CurrentThread.ManagedThreadId + "\r\n");
return View();
}
我連着Tail這個文件,也明星結合Fiddler查看HTTP上發生了什麼。再次兩個About
和Contact
環節之間導航,我看到下面的輸出:
從尾巴:
- ...
- 2012年9月12日下午12時14分07秒:關於,螺紋7
- 2012年9月12日下午12時14分08秒:聯繫人,螺紋7
- 2012年9月12日12:14:下午9點:關於,螺紋7
- 2012年9月12日下午12時14分十秒:聯繫人,螺紋7
- 2012年9月12日下午十二時14分11秒:關於,用線6
- 9/12/2012 12:14:12 PM:聯繫,線程8
- 2012/9/12 12:14:31:聯繫,線程7
- 2012年9月12日下午12點14分50秒:聯繫人,螺紋7
- 2012年9月12日下午12點15分03秒:關於,螺紋7
- 2012年9月12日12: 15:05 PM:聯繫人,螺紋8
- 2012年9月12日下午12時15分23秒:關於,用線6
- 2012年9月12日下午12時十五分42秒:關於,螺紋14
- 2012/9/12 12:16:01:關於,thread 6
- 2012年9月12日下午12時一十六分31秒:聯繫人,螺紋7
- 2012年9月12日下午12點16分33秒:關於,螺紋14
- ...
- 9/12/2012下午12點17分08秒:聯繫人,螺紋12
- 2012年9月12日下午12時17分09秒:關於,螺紋12
- 2012年9月12日下午12點17分28秒:關於,線5
- ...
從小提琴手爲同一請求(請注意,我也一直在跟我的角色端點設置玩耍,但沒有成功):
所以...拿回家的消息是在這裏:
- 的HTTP流量似乎正常(提琴手沒有顯示任何重複請求)
- 動作方法被調用兩次或三次有時對於相同的要求,似乎不確定性(即上面描述的原始問題)
- 有趣的是,在我的情況下,似乎好像恰好是 19s在動作方法發生另一個'命中'之前(即當動作方法被多次命中時,命中是確定的)
- 的線程ID一般是每個命中不同每當操作方法被擊中多次
我會繼續挖掘更深......也許有人會熱情地向提個建議基於這個更新的信息雖然:)。
編輯2 我決定在每種情況下在action方法中打印進程ID和線程ID。對於每個請求,進程ID都是與IIS Express工作進程對應的進程ID。因此,似乎IIS Express Worker Process有時會產生多個線程來處理請求,每個線程相距19s。
...我更深的去... :)
編輯3
我想我越來越接近問題...我有一個看看IIS快遞托盤只見我已經開始應用(沒有調試)後以下內容:
我決定直接使用(而不是127.0.0.2:8888如圖提琴手以上)這個URL,這個問題本身急於消失。這現在開始有意義了......如果我通過端口8889直接調用IIS應用程序,則一切工作正常,與原始非Azure項目一樣。如果我通過端口8888調用web角色(即特定於Azure的部分),它有時似乎會多次調用IIS應用程序。
因此,我現在開始將重點放在Web角色上。我會嘗試看看,如果我能找到一些相關的Web角色日誌...
EDIT 4
我確信diagnostics was set up properly上的應用程序,並在調試模式下運行它。然後,我進入Azure計算模擬器用戶界面,右鍵單擊我的Web角色實例,然後選擇「打開本地存儲」。這把我帶到資源管理器,在那裏我能找到一個子文件夾「temp \ temp \ RoleTemp \ iisexpress」,其中有一個日誌文件,內容看起來像這樣(請注意,我已將端點更改回端口80 ,所以IIS Express應用程序現在已經回到端口81):
- 請求開始: 「GET」 127.0.0.1:81/Home/About
- 請求結束:127.0.0.1:81/Home/About與HTTP狀態200.0
- 請求開始: 「GET」 127.0.0.1:81/Home/Contact
- 請求結束:127.0.0.1:81/Home/Contact與HTTP狀態200.0
- 請求開始: 「GET」 127.0.0.1:81/Home/Contact
- 請求結束:127.0.0.1:81/Home/Contact,HTTP狀態200.0
- 請求開始: 「GET」 127.0.0.1:81/Home/Contact
- 請求結束:127.0.0.1:81/Home/Contact,HTTP狀態200.0
- 請求開始: 「GET」 127.0.0。 .1:81 /首頁/關於
- 請求結束:127.0.0.1:81/Home/關於HTTP狀態200。0
- 請求開始: 「GET」 127.0.0.1:81/Home/About
- 請求結束:127.0.0.1:81/Home/About,HTTP狀態200.0
- 請求開始: 「GET」 127.0.0.1:81/Home/About
- 請求結束:127.0.0.1:81/Home/About,HTTP狀態200.0
- 請求開始: 「GET」 127.0.0.1:81/主頁/聯繫方式
- 請求結束:127.0.0.1:81/Home/Contact,HTTP狀態200.0
- 請求開始: 「GET」 127.0.0.1:81/Home/Contact
- 請求結束:127.0 .0.1:81 /主頁/ HTTP狀態聯繫200.0
- 請求開始: 「GET」 127.0.0.1:81/Home/Contact
- 請求結束:127.0.0.1:81/Home/Contact與HTTP狀態200.0
- 請求開始: 「GET」 127.0.0.1:81/Home/About
- 請求結束:127.0.0.1:81/Home/About,HTTP狀態200.0
- 請求開始: 「GET」 127.0.0.1 :81 /主頁/聯繫
- 請求結束:127.0.0.1:81/Home/Contact,HTTP狀態200.0
再次我只是在關於和聯繫頁面之間切換,所以從日誌可以看出單個Web角色端點請求有時會導致多次調用IIS應用程序的Web角色。現在搜索一些更高級別的Web角色日誌來找出它爲什麼這樣做:)!
不確定你的問題,但我可以告訴你重新映射是非常正常的 - 我的Azure模擬器每次都會這樣做,我對MVC4沒有任何問題。 – JcFx