2012-03-26 53 views
4

我想知道是否有人對這裏發生的事情有線索,並可能指向正確的方向。ASP.NET MVC:這怎麼可能?參數字典包含參數「x」的空條目

好的..lets將代碼放在上下文中。

我有AJAX方法(jQuery的)類似這樣:

$xmlHttp("/Api/GetWaitingMessages", { count: 20 }) 
    .always(processResult); 

($ XMLHTTP只是封裝一個jQuery延遲執行,以及一些基本的$ AJAX選項)

而在我們healthmonitoring後臺我見事情是這樣的:

Exception information: 
Exception type: System.ArgumentException 
Exception message: The parameters dictionary contains a null entry for parameter 'count' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.ActionResult GetWaitingMessages(Int32)' in 'AjaxController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter. 
Parameter name: parameters 

現在的事情是,我把一些痕跡&嘗試/捕獲(用於測試),以確保jQuery的永遠不會調用GetWaitingMess年齡有一個空的或未定義的「計數」,但就healthmonitoring exeptions去:GetWaitingMessages被實例化並作爲參數傳遞null。 (據我所知,MVC實例通過反射法)

BTW:該錯誤僅發生一樣,也許1出成千上萬的請求

GetWaitingMessages的簽名是:

​​

所以我想,MV​​C不應該擊中該方法,因爲應該沒有簽名匹配。

MVC是否有高流量網站(即多線程問題)的問題?

上述網站運行在具有網絡負載平衡和IP關聯性的5個Web服務器場服務器羣集上。

每個服務器在高峯時間約有1500個請求/秒。

該網站使用的URL重寫,因爲它是一個可換膚&多種語言的白色標籤網站地圖域的區域(即test.com將只需插入/測試到URL)。

現場配置更多的細節:

,供應Ajax請求飾有

[SessionState(SessionStateBehavior.Disabled)] 

的HttpModules但如認爲是無用的,其中刪除,因爲我們需要運行控制器:runAllManagedModulesForAllRequests = MVC中的「true」。我可以設置runAllManagedModulesForAllRequests =「false」,然後嘗試找出要添加的內容,按照哪個順序,但發現只是刪除我所知道的並不重要。

<remove name="AnonymousIdentification" /> 
<remove name="Profile" /> 
<remove name="WindowsAuthentication" /> 
<remove name="UrlMappingsModule" /> 
<remove name="FileAuthorization" /> 
<remove name="RoleManager" /> 
<remove name="Session" /> 
<remove name="UrlAuthorization" /> 
<remove name="ScriptModule-4.0" /> 
<remove name="FormsAuthentication" /> 

下面都激活和配置在web.config

<pages validateRequest="false" enableEventValidation="false" enableViewStateMac="true" clientIDMode="Static"> 

and also: 
urlCompression 
staticContent 
caching 
outputCache 

編輯:只是分析了我跟蹤日誌的詳細一點。當發生錯誤時,我看到(Content-Length:8),它對應於(count = 20)。但是,我沒有看到日誌中的任何查詢參數。我將HttpInputStream轉儲到了日誌中,而且它完全是空的......但就像我剛纔提到的那樣,日誌也會說Content-Length = 8,所以這裏有些錯誤。

難道IIS(最終URL重寫)將它的東西的地方,一路上混淆?

-

任何幫助,將不勝感激..i'm撕扯我的頭髮試圖瞭解可能被錯誤怎麼回事。

謝謝,羅伯特

+0

這裏談到因爲是Q被刪除:「我敢肯定,我沒有看錯了(不是我同意)..also找不到鏈接,但如果你在Google上搜索‘異步50ms的’」 - 對,如果你的谷歌的「異步50毫秒」,你會發現一堆有關異步/等待和50毫秒,這與多線程編程無關的線程:-)「異步和等待關鍵字不會導致創建額外的線程」 (c)中http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx#BKMK_Threads – zerkms 2013-07-08 04:43:34

+0

當使用異步/等待你在邏輯使用函數與返回類型任務/任務的,其創建線程。所以雖然關鍵字並不意味着自己的多線程,但它們只能在多線程上下文中使用(Task <>)。 – Robert 2013-07-08 14:20:26

+0

對不起爲是insistant,但我還沒有看到一個異步/ AWAIT組合然而不等待任務<> – Robert 2013-07-08 14:23:29

回答

0

什麼類型的請求中,貴xmlHttp問題到服務器(GETPOST或別的東西)?

什麼是GetWaitingMessages操作方法的定義是什麼?

這可能是由於接受的動詞或參數名稱不匹配造成的。

+0

所有的AJAX請求是POST,並在healthmonitoring跟蹤顯示服務器變量爲失敗的方法的請求也在POST中,所以看起來很好。 – Robert 2012-03-26 09:58:22

+0

我做了什麼嘗試,是把一個如果對阿賈克斯請求,以確保沒有請求離開,如果計數!= 20,但是請求確實發生,所以我認爲count = 20,但是錯誤仍然會發生。所以我假設錯誤必須在服務器端。 GetWaitingMessages()只是這種行爲影響許多其他方法的一個例子:( – Robert 2012-03-26 10:11:10

0

我有一種感覺,這可能是與MVC不能夠綁定到你的「計數」參數的問題。默認情況下,它期望該參數被命名爲'id'。

你可以嘗試以下方法:

  1. 修改您GetWaitingMessages行動,與調用,而不是「數」「ID」參數來定義它
  2. 創建自定義模型作爲公認的答案所描述的結合在asp.net mvc routing id parameter

希望計算器問題,這有助於

編輯:剛纔看到你的回覆到另一個swer聲明行動是一個POST。在這種情況下,綁定可能不是問題。

+0

這個問題並沒有系統地發生,但更像是1誰知道有多少數千請求..但是,謝謝,我會看到如果這個改變任何東西 – Robert 2012-03-26 10:04:53

0

只是爲了測試嘗試這個,看看是否有任何問題。

public virtual ActionResult GetWaitingMessages(FormCollection form) 
{ 
    var count=Int32.Parse(form["count"]); 

    .... 
} 

當然,如果計數字段沒有設置,它會拋出。如果它總是正常工作,那麼問題是路由或模型綁定。

+0

感謝,會給這個嘗試 – Robert 2012-03-26 11:05:19

+0

把測試剛剛看到您的回覆後網上,並得到了我的第一對夫婦的錯誤的請告訴我奇怪的是,我的跟蹤顯示「內容長度:8!」,這與完美對應形式參數(數= 20)。你認爲它有可能或非常不可能的URL重寫可能在這裏打搞笑招數?謝謝 – Robert 2012-03-26 11:59:24

+0

是否使用IIS 7+?我更喜歡處理的URL在應用程序重寫。目前我正在開發多租戶的skinable應用程序,我已經實現了我自己的URL重寫映射到一個共同的路線格式「租戶/控制器/行動」的要求,這是一個非常棘手的一塊鱈魚E,但在我的測試,到目前爲止它工作正常(但它是不是還沒有一個真正的高併發的情況下測試) – MikeSW 2012-03-26 12:09:39

相關問題