2012-12-08 15 views
7

這可能需要一些時間來解釋,但在這裏我去:)。控制器操作多次觸發 - 在Azure模擬器中運行的ASP.NET MVC 4應用程序

我創建了兩個的Visual Studio 2012項目:

  1. 使用A項目(網絡 - > ASP.NET MVC 4 Web應用程序)在Visual Studio中的模板添加項目對話框。我沒有添加單元測試項目。
  2. 使用Azure雲服務模板(雲 - > Windows Azure雲服務)的項目。我添加了一個角色,一個ASP.NET MVC 4 Web角色,並且再次沒有添加單元測試項目。

這兩個項目完全不受Visual Studio爲我創建它們的方式的影響。

對於每個項目,然後我去了HomeController類,並在每個AboutContact動作方法(無聊的動作,只是返回一個視圖)設置一個斷點。例如,我在方法的唯一一行上設置了一個斷點:

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模擬器生成的任何其他日誌可能會幫助我嗎?

我真的很感激在這裏正確的方向推動:)。

乾杯!

編輯

這裏的一些信息(我更新了這個問題,因爲我繼續調試這個問題):

我決定運行無需調試的解決方案,我把一些簡單的同時在AboutContact動作方法調試信息,例如:

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上發生了什麼。再次兩個AboutContact環節之間導航,我看到下面的輸出:

從尾巴:

  • ...
  • 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
  • ...

從小提琴手爲同一請求(請注意,我也一直在跟我的角色端點設置玩耍,但沒有成功):

Fiddler screenshot showing HTTP traffic

所以...拿回家的消息是在這裏:

  • 的HTTP流量似乎正常(提琴手沒有顯示任何重複請求)
  • 動作方法被調用兩次或三次有時對於相同的要求,似乎不確定性(即上面描述的原始問題)
  • 有趣的是,在我的情況下,似乎好像恰好是 19s在動作方法發生另一個'命中'之前(即當動作方法被多次命中時,命中是確定的)
  • 的線程ID一般是每個命中不同每當操作方法被擊中多次

我會繼續挖掘更深......也許有人會熱情地向提個建議基於這個更新的信息雖然:)。

編輯2 我決定在每種情況下在action方法中打印進程ID和線程ID。對於每個請求,進程ID都是與IIS Express工作進程對應的進程ID。因此,似乎IIS Express Worker Process有時會產生多個線程來處理請求,每個線程相距19s。

...我更深的去... :)

編輯3

我想我越來越接近問題...我有一個看看IIS快遞托盤只見我已經開始應用(沒有調試)後以下內容:

IIS Express window showing the IIS Application running under the web role

我決定直接使用(而不是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角色日誌來找出它爲什麼這樣做:)!

+0

不確定你的問題,但我可以告訴你重新映射是非常正常的 - 我的Azure模擬器每次都會這樣做,我對MVC4沒有任何問題。 – JcFx

回答

0

因此,基於我在原來的職位的各種編輯寫道:

  • 在我的機器至少,在DevFC.exe過程(開發面料,Azure計算仿真器)有時產卵多個請求從IIS Express請求的資源。也就是說,它將在模擬器端點上接受單個請求,並且有時會一個接一個地向底層IIS Express應用程序發出多個請求,即使它們都以HTTP狀態代碼200成功。這些產生的請求之間的時間差異似乎是恆定的,但除此之外,行爲似乎是不確定的(即,對模擬器端點的每個請求都不會發生)。
  • 爲了調試這一點,我需要訪問Azure計算仿真器,這是我猜我不能得到的源代碼。

現在,我的理論(也是希望)是這種行爲在某種程度上與我的開發環境有關,並且不會在真實的Azure基礎結構上重現。這就是說,我想出了一個解決辦法...

我創建了一個簡單的代理文件,爲Firefox重定向所有流量將我的本地Azure的仿真器端口到IIS Express應用程序的端口。這解決了這個問題,但是我意識到我基本上繞過了Azure模擬器,並且我猜測我可能在將來會遇到問題,因爲我正在這樣做(例如,如果我決定使用AppFabric緩存? )!

與此同時,我將繼續開發此解決方案,並定期將其部署到我的Azure分段環境中進行測試。

無論如何,如果有人知道我可以如何解決根本問題,讓我知道! :)

編輯: 我不再能夠使用版本2.2的Azure SDK工具重現此問題。如果您仍然看到這種行爲,請嘗試升級!

+0

我不認爲你可以在模擬器上設置負載均衡或運行狀況檢查(從未在開發過程中做過,但在產品中做過),但我想知道是否它是這樣的......這些健康檢查ping確實發生在Azure刺。此外,Azure存儲在產品中也會發揮作用。你正在運行Azure SDK 1.8嗎? –

+0

嗨巴特,感謝您的迴應。我的確在運行Azure SDK 1.8。我試圖重新安裝它,無濟於事。使用.NET反射器專業版試圖調試它,但我不確定我可以如何繼續(現在正如我上面提到的,它對我而言也是一個較低的優先級)。我只是有興趣知道是否有其他人可以重現這種行爲,如果是這樣的話,我可能會在Microsoft連接上提起它。 – sammy34

+0

OMG,我終於找到了一個具有同樣問題的人......我的運行方式與您的完全相同,即Windows 8上的Visual Studio 2012和Azure SDK 1.8,並且我得到了多次調用的相同奇怪行爲來自瀏覽器的多個請求!它看起來確實是非確定性的,而且發生在需要一段時間才能完成的行動中(但這可能只是一種印象)。到目前爲止,我還沒有找到任何解決方法,並且非常絕望,因爲它確實減慢了我的工作速度。你從那以後有什麼進展?你有沒有嘗試在完整的IIS中運行模擬器? – ThomasWeiss

相關問題