Ich habe mich gefragt, ob jemand eine Ahnung davon hat, was hier passiert, und könnte mir in die richtige Richtung zeigen.ASP.NET MVC: Wie ist das möglich? Das Parameterwörterbuch enthält einen Nulleintrag für den Parameter 'x'
Ok ..lets setzen den Code in den Kontext.
Ich habe Ajax-Methoden (jquery) wie folgt aus:
$xmlHttp("/Api/GetWaitingMessages", { count: 20 })
.always(processResult);
($ xmlHttp einfach hüllt ein jQuery defered, und einige grundlegende $ Ajax-Optionen)
Und in unserem health Back-Office-i sehen Dinge wie diese:
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
Nun ist die Sache, platziert ich einige Spuren & try/Fangmengen (zum Testen), um sicherzustellen, dass jQuery GetWaitingMess nie ruft Alter mit einem leeren oder undefinierten "count", aber soweit die healthmonitoring Ausnahmen gehen: GetWaitingMessages wurde instanziiert und Null als Parameter übergeben. (Von dem, was ich verstehe, instanziiert MVC Methoden über Reflexion)
btw: der Fehler tritt nur auf, wie vielleicht 1 von vielen Tausenden von Anfragen
Die Signatur von GetWaitingMessages ist:
public virtual ActionResult GetWaitingMessages(int count)
{
....
}
Also nehme ich an, mvc sollte nicht einmal die Methode treffen, da es keine Signatur-Übereinstimmung geben sollte.
Hat MVC Probleme mit Websites mit hohem Traffic (zB Multithreading-Probleme)?
Die oben genannte Website wird auf einem Cluster von 5 Webfarm-Servern mit Netzwerklastenausgleich und IP-Affinität ausgeführt.
Jeder Server bekommt zu Spitzenzeiten 1500 Anfragen/Sek.
Die Website verwendet URL Rewriting, um Domänen zu Bereichen zuordnen (dh test.com wird einfach in die URL einfügen/testen), da es eine skinfähige & mehrsprachige White-Label-Website ist.
Einige weitere Details vor Ort Konfiguration:
Der Controller, der mit
[SessionState(SessionStateBehavior.Disabled)]
Httpmodules ist dekoriert AJAX-Anfragen dient, dass, wenn nutzlos angesehen, wenn entfernt, da wir laufen müssen: runAllManagedModulesForAllRequests = "wahr" in MVC. Ich könnte runAllManagedModulesForAllRequests = "false" gesetzt haben und dann versuchen, herauszufinden, was ich hinzufügen möchte, in welcher Reihenfolge, aber es ist einfacher, einfach das zu entfernen, von dem ich weiß, dass es nicht notwendig ist.
<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" />
Die folgenden Kreditkarten werden aktiviert und konfiguriert in der web.config
<pages validateRequest="false" enableEventValidation="false" enableViewStateMac="true" clientIDMode="Static">
and also:
urlCompression
staticContent
caching
outputCache
EDIT: analysiert nur meine Spur ein bisschen mehr protokolliert.Wenn der Fehler auftritt, sehe ich (Content-Length: 8), was (count = 20) entspricht. Ich sehe jedoch keine Abfrageparameter in den Protokollen. Ich habe den HttpInputStream an die Logs ausgegeben, und er ist komplett leer. Aber wie ich gerade erwähnt habe, sagen die Logs auch, dass Content-Length = 8 ist, also stimmt hier etwas nicht.
Könnte IIS (eventuell URL-Rewriting) sein Zeug irgendwo auf dem Weg vermischen?
-
Jede Hilfe wäre sehr versuchen, geschätzt werden ..i'm zerreißt mir die Haare aus zu verstehen, was möglicherweise falsch hier gehen könnte.
Danke, Robert
Kommentieren hier seit dem Q wurde gelöscht: "Ich bin sicher, ich habe es nicht falsch gelesen (nicht, dass ich zustimme) .. auch nicht den Link finden. Aber wenn Sie google suchen" async 50ms "" - Richtig, wenn du nach "async 50ms" suchst, wirst du eine Menge Threads über Async/Await und 50ms finden, was nichts mit Multithread-Programmierung zu tun hat :-) "Die async und await-Schlüsselwörter verursachen keine zusätzlichen Threads." (c) http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx#BKMK_Threads – zerkms
Wenn Sie async/await verwenden, verwenden Sie logisch Funktionen mit einem Rückgabetyp von Task/Task, die erstellt werden Fäden. Während also die Schlüsselwörter nicht selbst Multi-Threading bedeuten, können sie nur in einem Multi-Threading-Kontext verwendet werden (Task <>). –
Robert
Entschuldigung dafür, dass ich hartnäckig bin, aber ich habe noch kein async/await-combo gesehen, das keinen Task erwartet <> – Robert