0

J'ai une API Web ASP.NET hébergée sur Azure. J'ai intégré le gestionnaire de messages HTTP à cette API. Le gestionnaire de messages est frappé quand je le frappe en utilisant l'appel AJAX. J'envoie également un en-tête de demande dans mon appel AJAX. Le problème est que je ne reçois pas l'en-tête envoyé à partir de l'appel AJAX à Message Handler intégré dans l'API Web. Reportez-vous l'image: Debugger screenshotImpossible d'obtenir des en-têtes à partir de la requête jQuery AJAX dans l'API Web ASP.NET

Ci-dessous le code de ma requête AJAX:

$.ajax({ 
    url: "https://someservicename.azurewebsites.net/Service/RequestHandler", 
    beforeSend: function (xhr) { 
     xhr.setRequestHeader('Token', '86810e135958961ad4880ad'); 
    }, 
    type: "POST", 
    crossDomain: true, 
    data: { 
     param: "Passed Parameter" 
    }, 
    success: function (msg) { 
     console.log(msg); 
    }, 
    error: function (XMLHttpRequest, textStatus, errorThrown) { 
     console.log(textStatus); 
    } 
}); 

Le gestionnaire de messages dans l'API Web ressemble ci-dessous:

protected async override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
{ 
    string authToken; 
    try 
    { 
     authToken = request.Headers.GetValues("Token").FirstOrDefault(); 

     if (authToken != "86810e135958961ad4880ad") 
     { 

      return await Task.Factory.StartNew(() => 
      { 
       return new HttpResponseMessage(HttpStatusCode.BadRequest) 
       { 
        Content = new StringContent("Unauthorized access!") 
       }; 
      }); 
     } 
     else 
     { 
      return await base.SendAsync(request, cancellationToken); 
     } 
    } 
    catch (System.InvalidOperationException) 
    { 
     return null; 
    } 
} 

Quand je lance le code de mon IIS localhost la demande qui est envoyée est quelque chose comme ci-dessous:

Accept:*/* 
Accept-Encoding:gzip, deflate, sdch, br 
Accept-Language:en-US,en;q=0.8 
Access-Control-Request-Headers:token 
Access-Control-Request-Method:POST 
Connection:keep-alive 
Host:someservicename.azurewebsites.net 
Origin:http://localhost:12522 
Referer:http://localhost:12522/pocppd.html 
User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36 

Et le respon se que j'obtenir dans la console est:

https://someservicename.azurewebsites.net/Service/RequestHandler. Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:12522' is therefore not allowed access. The response had HTTP status code 500. 

Avec le client PostMan la demande fonctionne très bien, mais de localhost il renvoie une erreur. S'il vous plaît laissez-moi savoir la raison pour ne pas obtenir l'en-tête dans mon gestionnaire de message?

+0

Réponse sur la console -qui sera apporte des dizaines de [résultats] (https://www.google.com.tr/search?q=Response+to+preflight+request+doesn % 27t + pass + access + contrôle + contrôle% 3A + No +% 27Access-Control-Autoriser-Origin% 27 & oq = Réponse + à + preflight + requête + doesn% 27t + pass + access + contrôle + check% 3A + No +% 27Access -Control-Autoriser-Origine% 27 & aqs = chrome..69i57j69i59.119j0j7 & sourceid = chrome & ie = UTF-8) lors de la recherche- vous indique simplement que l'origine de quelle requête provient n'est pas autorisée sur le serveur comme à cause de la norme CORS. La réponse de Marius est un moyen de rendre la réponse du serveur aux demandes de votre 'localhost'. – ibubi

Répondre

1

Vous devez ajouter dans votre web.config (vous pouvez modifier les valeurs que vous avez besoin):

<httpProtocol> 
     <customHeaders> 
      <add name="Access-Control-Allow-Origin" value="*" /> 
      <add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept, Authorization, Token" /> 
      <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE" /> 
     </customHeaders> 
    </httpProtocol> 

Avant votre demande, une demande OPTIONS est envoyée à vous assurer que vous êtes autorisé à effectuer la demande . Comme l'erreur l'indique, "La réponse à la demande de contrôle en amont ne passe pas le contrôle d'accès vérifier: aucun en-tête" Access-Control-Allow-Origin "n'est présent sur la ressource demandée.". Ajouter les lignes ci-dessus dans Web.config passera l'en-tête nécessaire. MDN indique: "Contrairement aux requêtes simples (décrites ci-dessus), les requêtes" en amont "envoient d'abord un en-tête de requête HTTP OPTIONS à la ressource de l'autre domaine, afin de déterminer si la requête peut être envoyée en toute sécurité. Les demandes de site sont contrôlées en amont, car elles peuvent avoir des implications sur les données de l'utilisateur. "

+0

J'ai ajouté ci-dessus dans mon web.config mais toujours confronté au même problème ... il casse dans la demande de contrôle en amont ... en-tête d'AJAX envoyé comme 'Access-Control-Request-Headers: autorisation' _without_ sa valeur –

+0

Merci @Marius , ce que j'ai compris est que ma demande est contrôlée en amont, il ne porte pas les en-têtes personnalisés, lorsque la demande réelle après le contrôle est envoyé l'en-tête personnalisé va de pair avec elle! –

+0

Je suis heureux d'apprendre que vous avez réussi à le réparer. –

1

Essayez cette

$.ajax({ 
    url: "https://someservicename.azurewebsites.net/Service/RequestHandler", 
    headers: { 
      "Token": "86810e135958961ad4880ad" 
     },  
    type: "POST", 
    crossDomain: true, 
    data: { 
     param: "Passed Parameter" 
    }, 
    success: function (msg) { 
     console.log(msg); 
    }, 
    error: function (XMLHttpRequest, textStatus, errorThrown) { 
     console.log(textStatus); 
    } 
}); 
+0

ci-dessus ne fonctionne pas ... même numéro –