2017-04-13 18 views
0

私はAzureでホストされているASP.NET Web APIを持っています。私はそのAPIにHTTP Message Handlerを統合しました。メッセージハンドラは、AJAX呼び出しを使用してヒットしたときにヒットしています。私はまた、私のAJAX呼び出しでいくつかのリクエストヘッダーを送信しています。問題は、Web APIに統合されたMessage HandlerへのAJAX呼び出しからヘッダーを送信していないことです。画像を参照してください:Debugger screenshot以下ASP.NET Web APIのjQuery AJAXリクエストからヘッダーを取得できません

は私の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); 
    } 
}); 

は、Web APIでのメッセージハンドラは、以下のようになります。

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; 
    } 
} 

私はIISからコードを実行しますlocalhostは次のようなものです:

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 

私がコンソールに入っているseは:

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. 

POSTMANクライアントでは、要求は正常に動作しますが、ローカルホストからはエラーが返されます。私のメッセージハンドラにヘッダーがない理由を教えてください。

+0

レスポンス(https://www.google.com.tr/search?q=Response+to+preflight+request+doesnをお試しください%27t + pass + access + control + check%3A + No +%27Access Control From Origin%27&oq =応答+ +プリフライト+リクエスト+ doesn%27t + pass + access + control + check%3A + No +%27Access -Control-Allow-Origin%27&aqs = chrome..69i57j69i59.119j0j7&sourceid = chrome&ie = UTF-8)を検索すると、CORS標準のために、要求の発信元がサーバー上で許可されていないことがわかります。 Mariusの答えは、あなたの 'localhost'からのリクエストに対してサーバーのrepsonseを行う方法です。 – ibubi

答えて

1

あなたは(あなたが必要としてあなたが値を変更することができます)あなたのWeb.configでこれを追加する必要があります。

<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> 

を申請する前に、OPTIONSリクエストは、リクエストを実行するために許可されていることを保証するために送られ、 。エラーが示すように、 "プリフライト要求に対する応答はアクセス制御チェックに合格しません:要求されたリソースには 'Access-Control-Allow-Origin'ヘッダーがありません。" Web.configの上記の行を追加すると、必要なヘッダーが渡されます。 "実際に要求が安全かどうかを判断するために、"プレフライト "リクエストは、最初にHTTP OPTIONSリクエストヘッダーを他のドメインのリソースに送信します。サイトのリクエストは、ユーザーデータに影響を与える可能性があるため、このようにプリフライトされます。

+0

私は上記のweb.configに追加しましたが、同じ問題に直面しています... AJAXのプリフライトリクエスト...ヘッダが 'Access-Control-Request-Headers:authorization'として送信されました_without_その値 –

+0

Thanks @Marius私の考えたことは、私の要求がプリフライトされているからです。プリフライト後の実際のリクエストが送られてくると、それはカスタムヘッダーを持っていません。 –

+0

あなたはそれを修正できたと聞いてうれしいです。 –

1

意志が[結果]の数十をもたらし-whichコンソール上でこの

$.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

は動作しません...同じ問題 –

関連する問題