2012-03-26 4 views
4

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

+0

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

+0

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

+0

Entschuldigung dafür, dass ich hartnäckig bin, aber ich habe noch kein async/await-combo gesehen, das keinen Task erwartet <> – Robert

Antwort

0

Welche Art einer Anforderung ist Ihre xmlHttp Fragen zu einem Server (GET, POST oder etwas anderes)?

Was ist die Definition von GetWaitingMessages Aktionsmethode?

Es könnte sehr wohl der Fall sein, dass akzeptierte Verben oder Argumentnamen nicht übereinstimmen.

+0

Alle ajax-Anfragen sind POST, und die Servervariablen in der healthmonitoring-Ablaufverfolgung zeigen die Anfrage für die fehlgeschlagene Methode an war auch in POST, so scheint das in Ordnung. – Robert

+0

Was ich versucht habe, ist es, eine wenn auf die Ajax-Anfragen, um sicherzustellen, dass keine Anfrage verlässt, wenn zählen!= 20, jedoch geht die Anfrage, also nehme ich an, dass count = 20, aber der Fehler wird immer noch auftreten. Also ich vermute, dass der Fehler auf der Serverseite sein muss. GetWaitingMessages() war nur ein Beispiel für viele andere Methoden, die von diesem Verhalten betroffen sind :( – Robert

0

Ich habe das Gefühl, dass dies ein Problem sein könnte, da MVC nicht in der Lage ist, an Ihren 'count'-Parameter zu binden. Standardmäßig erwartet der Parameter den Namen 'id'.

können Sie versuchen, die folgenden:

  1. Aktion Ändern Sie bitte Ihre GetWaitingMessages es mit einem ‚id‘ anstelle von ‚count‘
  2. Erstellen eines benutzerdefinierten Modell namens Parameter zu definieren, wie in der akzeptierte Antwort beschrieben Bindung an die Frage Stackoverflow bei asp.net mvc routing id parameter

this helps

EDIT: Gerade gesehen, Ihre Antwort auf eine andere ein swer, dass die Aktion ein POST ist. In diesem Fall ist die Bindung möglicherweise kein Problem.

+0

Das Problem passiert nicht systematisch, aber eher wie 1 von wer weiß, wie viele tausend Anfragen .. Aber ja, und danke, ich werde sehen, ob das ändert alles! – Robert

0

Nur zum Testen versuchen Sie dies, um festzustellen, ob ein Problem vorliegt.

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

    .... 
} 

Natürlich wird es werfen, wenn das Zählfeld nicht gesetzt ist. Wenn es immer richtig funktioniert, ist das Problem mit Routing oder Modellbindung.

+0

Danke, werde versuchen – Robert

+0

Stellen Sie den Test online, nachdem Sie Ihre Antwort gesehen haben, und bekam meine ersten Fehler.Was ist seltsam ist, dass meine Spur zeigt "Content-Length: 8", was perfekt entspricht form parameter (count = 20) Denken Sie, es ist wahrscheinlich oder sehr unwahrscheinlich, dass url rewriting hier lustige Tricks spielen? Danke – Robert

+0

Verwenden Sie IIS 7+? Ich bevorzuge URL-Rewriting in der Anwendung zu behandeln. Derzeit entwickle ich eine mandantenfähige, skinfähige Anwendung und ich habe meine eigene URL-Umschreibung implementiert, um die Anfrage in ein allgemeines Routenformat "Mieter/Controller/Aktion" zu mappen. Es war ein sehr heikles Stück Kabeljau e, aber bis jetzt in meinen Tests funktioniert es ok (aber es ist noch nicht in einer echten hochgradig konkurrierenden Situation getestet) – MikeSW

Verwandte Themen