2016-08-02 22 views
0

Ich habe eine HTML/Javascript-Seite, die einen jQuery-Ajax-Aufruf an einen .NET-Ajax-Handler (.ASHX) macht. Beim ersten Aufruf sind die Parameter, die ich im Datenobjekt übergebe, vorhanden und korrekt. Aber in nachfolgenden Aufrufen sind sie NULL.Warum sind IHttpHandler Request.Params beim ersten Aufruf korrekt, aber NULL beim zweiten Aufruf?

JavaScript Setup:

var data = { 

    requestType: "RecentMXMeetings", 
    meetingType: "Maintenance", 
    baseDate: "6/15/2016", 
    daysPast: 90, 
    daysFuture: 30 
} 

$.ajax({ 

    type: "GET", 
    url: "ajaxHandler.ashx", 
    dataType: "text", 
    cache: false, 
    data: data, 

    success: function (result) { 
     alert("Success: " + result.responseText); 
    }, 

    error: function (result) { 
     alert("Error: " + result.responseText); 
    }, 

    fail: function (result) { 
     alert("Error - Fail: " + result.responseText); 
    }, 

    always: function (result) { 
     alert("Always: " + result.responseText); 
    } 

}); 

Handler-Code (.ashx):

public class ajaxHandler : IHttpHandler { 

    public void ProcessRequest(HttpContext context) { 

     string retJSON = "NODATA"; 

     var x = context.Request.Params["requestType"]; 


     if (!String.IsNullOrEmpty(x)) { 

      switch (x) { 

       case "RecentMXMeetings": 
        retJSON = SerialiseRecentMeetings(context); 
        break; 

        // other cases... 

      } 
     } 

     context.Response.ContentType = "text/plain"; 
     context.Response.Write(retJSON); 
    } 

    public bool IsReusable { 
     get { 
      return false; 
     } 
    } 

    // 
    // SerialiseRecentMeetings() and other methods... 
    // 

} 

füge ich einen Haltepunkt auf "var x = context....". Beim ersten Lauf x == "RecentMXMeetings". Bei den zweiten und den folgenden Runs ist x == null.

Hier ist, was ich in der Lage gewesen, in dem Debuggen es zu bestimmen:

Wenn ich den Ajax-Typen von ändern „GET“ auf „POST“ und starten Sie es, es dann zu „GET“ und ändert zurück laufen Auch hier werden die Datenobjektparameter einmal korrekt zurückgegeben, und nachfolgende Aufrufe sind wieder NULL. Das Umschalten zwischen "GET" und "POST" behebt das Problem für einen Anruf.

Das Problem ist intermittierend. Manchmal nach vier oder fünf Läufen wird x "RecentMXMeetings" zurückkommen und dann wieder auf null zurückgehen.

Warten auf eine Weile zwischen den Läufen wird manchmal "zurückgesetzt" und es wird gut für diesen Lauf sein. Dann gehe zurück, um wieder Null zu sein.

Dies ist mein erster Ausflug in Ajax Handler in C#, also bin ich ziemlich Anfänger auf diesem.

Ist das ein Caching-Problem? Gibt es hier ein asynchrones Problem? Werde ich den HttpHandler vielleicht nicht richtig nutzen oder entsorgen?

+0

Können Sie 'POST' anstelle von' GET' verwenden? –

+0

versuchen Sie es mit Fiddler, um Ihren Netzwerkverkehr anzuzeigen und zu sehen, ob der HttpHandler tatsächlich die Abfragezeichenfolge jedes Mal erhält. – Sal

Antwort

0

Es stellt sich heraus, dass mein Problem nicht mit dem Code selbst zusammenhing, sondern mit der Ausführung des Projekts.

Visual Studio, wenn Sie auf die Schaltfläche "Start Debug" klicken, wird die Lösung im Stammdokument (dh index.html) gestartet. Das ist, wenn das aktuelle geöffnete Dokument nicht von einem ausführbaren Typ wie HTML ist. Wenn Ihr aktuelles geöffnetes Fenster eine Ihrer Klassendateien (z. B. .cs) ist, versucht es nicht, die Klassendatei auszuführen, sondern startet die Debugsitzung in Ihrem Stammdokument.

Es wird jedoch versuchen, einen generischen Handler (.ashx) allein auszuführen, wenn dies das Dokument ist, das Sie gerade geöffnet haben. Und damit begann ich nicht auf der Seite index.html, die meine Ajax-Aufrufe ausgibt und Parameter an den Handler sendet. Meine Params-Sammlung war also null, weil sie buchstäblich null war. Das Ausführen der .ashx-Datei selbst liefert keine Parameter.

Also der Grund, warum es funktionierte, nachdem ich meinen Aufruf von GET zu POST und wieder zu GET geändert habe, weil ich die index.html-Datei geöffnet habe, um diese Änderung vorzunehmen, und als ich meine Debug-Sitzung erneut gestartet habe Mein aktuelles Dokument war die index.html-Datei, nicht die .ashx-Datei für den generischen Handler.

Ich sollte wahrscheinlich hundert Reputationspunkte verlieren, nur um diesen Dummkopf von einem Fehler zu machen. Aber falls es anderen hilft, ist es da.