2016-06-23 6 views
3

Das Problem, mit dem ich konfrontiert bin, ist, dass die Methode webClient.UploadData zweimal sofort von einer Jax-Anforderung ausgelöst wird. Aber dieselbe webClient.UploadData-Methode wird nur einmal ausgelöst, wenn sie von der aspx-Seite aufgerufen wird. Aus den Protokollen kann ich die Zeit der beiden Anfragen genau sehen, gesandt hat, ist das gleiche .. 2016.06.23 05: 54: 48,477Doppelte webClient-Anfragen, die genau zum gleichen Zeitpunkt vom AJAX-Aufruf gesendet wurden

Unten ist der Code-Schnipsel -

var DTO = JSON.stringify({Date: date, Month: month, AgeRange: ageRange, MethodName: "Enroll" }); 

$.ajax({ 
    type: "POST", 
    contentType: "application/json; charset=utf-8", 
    url: "/mypath/TasksHandler.ashx", 
    data: DTO, 
    async: true, 
    success: function(result) { 
    ...... 
    } 

TasksHander rufen die unter der Methode -

using (var client = new WebClient()) 
{ 
    client.Headers[HttpRequestHeader.ContentType] = "application/json"; 
    client.Headers[HttpRequestHeader.Accept] = "application/json"; 
    var data = Encoding.UTF8.GetBytes(dataInput); 
    byte[] result = client.UploadData(url, "POST", data); 
    output = Encoding.UTF8.GetString(result, 0, result.Length); 
} 

Meine Vermutung ist dies möglicherweise aufgrund der Einstellung der Async-Eigenschaft auf True in Ajax-Aufruf? Bitte lassen Sie mich wissen, wenn Sie darüber nachdenken.

+0

Wird Ihr Ajax-Anruf bei einem Ereignis ausgelöst? Können Sie diesen Teil des Codes auch teilen? – Rajesh

Antwort

0

das Problem in dem Code war es gab zwei Orte, die jQuery-Code wit eine CSS-Klasse „dob“ in HTML und es gab hatten h $ (". dob"). je (funktion (elem, val) {...} Diese Funktion führte zu einem Ajax-Aufruf ...

0

Es könnte sein, dass eine Preflight-Anfrage mit dem Ajax-Aufruf gemacht wird.

In diesem Fall wird der Browser eine HTTP OPTIONS Anfrage mit Access-Control-Request-Method Header vor der POST Anfrage ausgeben.

Können Sie die HTTP Method auf den zwei Anforderungen auf dem Server oder über die Browser-Netzwerkkonsole überprüfen? Wie ich schon sagte es könnte der erste sein OPTIONS und der zweite POST.

Um dies zu vermeiden, haben Sie einige Optionen, die wahrscheinlich am einfachsten sind, um sicherzustellen, dass das Skript und der Endpunkt, den es aufruft, sich auf derselben Domäne befinden.

Andernfalls können Sie einfach eine bedingte Überprüfung durchführen, um sicherzustellen, dass Bytes gesendet werden, indem Sie den Wert Ihrer dataInput oder data Variablen überprüfen.

Wenn das nicht dann bitte weitere Informationen in Bezug auf die Einrichtung, das heißt Skript A ist auf Server X und Script-B ist auf Server Y geben hilft usw.

+0

'Preflighted Anfragen' werden in Cross-Origin-Ressourcen-Sharing verwendet! 'Preflight-Anfragen' senden eine HTTP-Anfrage von der OPTIONS-Methode an die Ressource in der anderen Domäne, um zu bestimmen, ob die tatsächliche Anfrage sicher gesendet werden kann. In dem obigen Problem gibt es keine herkunftsübergreifende HTTP-Anfrage! –

+0

Ja, ich weiß, was sie sind - da die angegebenen URLs nur Beispiele sind, könnte es leicht Cross-Domain sein - also warum nur kopieren und fügen Sie einige Sachen in einem Kommentar, der im Grunde wiederholt, was ich gesagt habe? – Fraser

+0

Sie haben in Ihrer Antwort nicht "Cross-Domain" erwähnt, also nahm ich an, dass Sie das nicht wissen! Eine Antwort wie diese zu geben, lässt den Leser glauben, dass jede Ajax-Anfrage sendet .... –

0

Wenn Sie Click-Ereignis verwenden Bitte stellen Sie sicher, dass das Ereignis nur einmal ausgelöst wird. Um sicherzustellen, dass, unbind zuerst alle Click-Ereignis:

$(selector).unbind('click'); 

Dann binden Sie Ihre Handler:

$(selector).bind('click', function() {//...}); 

//You can chain calls ! 
$(selector).unbind('click').bind('click', function() {//...}); 

Wenn Sie eine button oder submit mit der Ajax-Ereignis auszulösen bitte sicher, dass Sie verhindern das Standardverhalten:

$(selector).submit(function(e){ 
    e.preventDefault(); 
    //Your ajax call 
    return false; 
});