2017-03-15 2 views
0

J'ai réussi à créer un appel ajax dans une page ASP, mais en utilisant Fiddler je vois qu'il y a toujours 3 appels, avec progressivement plus d'authentification, gaspillant le temps de transmission réseau et la bande passante.Firefox tournant un appel ajax en trois requêtes http, comment éviter les deux appels sans autorisation de Windows

Le premier appel n'a pas d'en-tête Authorization, et le serveur répond avec une page de 6 kilo-octets en indiquant HTTP 401.2 Unauthorized, avec des informations conviviales sur les causes les plus probables et les choses que vous pouvez essayer.

Ensuite, une seconde demande est envoyée, avec un en-tête supplémentaire comme:

Authorization: NTLM ....(56 bytes base64)... 

Maintenant, le serveur répond par un simple message html 341 octets juste dit:

Not Authorized 
HTTP Error 401. The requested resource requires user authentication. 

Ensuite, une troisième demande est envoyé, avec un en-tête Auth beaucoup plus long comme:

Authorization: NTLM ....(688 bytes base64)... 

Maintenant la réponse est à partir du code-behind, avec mon propre message JSON de 14 octets.

Pour moi, il semble inutile d'avoir ces deux premiers échanges de messages. Comment puis-je obtenir l'appel ajax pour toujours envoyer l'en-tête d'autorisation complète pour éviter les deux premières réponses d'environ 6500 octets, et pour obtenir mes propres 14 octets de réponse utile?

J'ai essayé d'ajouter le paramètre xhrFields.withCredentials = true, mais le comportement ci-dessus est vu avec et sans ce paramètre.

C'est l'appel ajax:

 $.ajax({ 
      type: "POST", 
      url: "Timeout_Test.aspx/GetAjax", 
      data: JSON.stringify(data), 
      contentType: "application/json; charset=utf-8", 
      dataType: "json", 
      xhrFields: { 
       withCredentials: true 
      }, 
      success: function (data, textStatus, jqXHR) {...}, 
      error: function (jqXHR, textStatus, errorThrown) {...} 
     }); 

La même chose se produit avec un appel asp javascript pour mon expérimentation en essayant d'éviter l'interruption de la session:

function get_asp() { 
     var xmlHttp = new XMLHttpRequest(); 
     xmlHttp.onreadystatechange = function() {...} 
     xmlHttp.withCredentials = true; 
     xmlHttp.open("GET", "Timeout_Test.aspx?type=keepalive", true); // true for asynchronous 
     xmlHttp.send(null); 
    } 

Le web.config contient:

<authentication mode="Windows"/> 

et pour accéder à la page je dois entrer le nom d'utilisateur Windows e et mon mot de passe, une fois. La page contient un bouton et une logique javascript avec une minuterie d'intervalle, et chaque minute ou alors un appel ajax est fait. Il me bat en fait comment le javascript connaît les informations de connexion, mais l'appel ajax fonctionne vraiment bien. Les deux messages d'erreur intermédiaires 401 sont cachés du code javascript et n'apparaissent nulle part, sauf visible dans l'outil de surveillance http Fiddler. La session de débogage firebug affiche seulement un appel ajax réussi, tandis que Fiddler montre clairement 3 requêtes http et 2 réponses d'erreur avec 401. Je fais une sortie horodatée sur ma page, et je suis sûr que je ne fais qu'un seul appel ajax toutes les minutes . Les 3 réponses sont rapides, dans un total d'environ 1 seconde.

Non, faites le total de 35 millisecondes. Demander 1 à T.471, réponse 1 à T.473, puis Req2 à T.487, Resp2 à T.489, enfin Req3 à T.502 avec Resp3 à T.505, où T est l'heure de 18:22:12 . Selon le volet Statistiques Fiddler. Avec le débogueur Visual Studio 2015 C#, j'ai trouvé que pour chaque appel ajax, le code derrière n'est appelé qu'une seule fois. Par conséquent, les deux premières demandes avec les réponses d'erreur 401, n'ont pas atteint le code-behind, seul le serveur Web.

Je dois deviner que le navigateur Firefox, qui interprète et exécutant le code javascript avec l'appel ajax, fait les trois requêtes http autorisation progressivement plus « automatiquement ».

La question est: comment puis-je programmer l'appel ajax afin que Firefox ne fasse que la troisième version de la requête http, sans passer par les deux premières requêtes http infructueuses?

+0

'toujours 3 appels' 3 appels est 3 demandes du navigateur? java-script et ajax est seulement 1 appel par requête donc si vous ne l'avez pas demandé, alors un autre appel ne sera pas fait. Je pense que plus d'informations sont nécessaires. – Seabizkit

+0

@Seabizkit Le code affiché est appelé une seule fois, mais provoque TROIS demandes. Ceci est seulement visible en utilisant le violoneux. Le code réussit et renvoie uniquement la réponse finale du code-behind et masque les deux messages d'erreur 402. – Roland

+1

nah roland, je suis comme 99% sûr que c'est impossible. '$ .ajax ({' est 1 appel, votre problème doit provenir d'une autre source ... – Seabizkit

Répondre

0

OK ce comportement bizarre semble provenir de l'interaction entre les deux demandes émises « en même temps ». J'ai déjà montré le code pour un appel ajax et pour un appel asp. Ceci est une page de test pour voir si et comment une session arrive à expiration avec des appels ajax et/ou asp. Lorsque ces deux sont proches, la requête http triple est vue.

Dans les cas plus normaux que nous avons soit un appel ajax, ou un appel asp, il n'y a qu'une seule demande http, entièrement sans tête d'autorisation.

Comme dans ce cas, le premier http demande réussit, cela semble un problème avec le serveur web, à savoir IIS, plutôt que le navigateur (Firefox). D'un autre côté, comme Firefox peut récupérer du 401 en envoyant un en-tête supplémentaire, il peut s'agir d'un protocole http standard, plutôt que d'un "bug".

Je peux vivre avec cette situation, comme en fonctionnement normal, je peux éviter de faire deux appels en même temps.