0

API からデータを取得する既存の角度コードがあります。リクエストに認証トークンを追加しようとしています。

まず、簡単な例を試しました

.factory('getDep', [
        '$resource', function($resource) {
            return $resource('/ContactsDatabaseAPI/deps/:id', { id: '@id' }, {
                query: {
                    method: 'GET',
                    isArray: false,
                    headers: {
                        'Authorization': 'Bearer ' + token
                    }
                },
                create: {
                    method: 'POST'
                },
                update: {
                    method: 'PUT'
                },
                remove: {
                    method: 'DELETE'
                }
            });
        }

GET 呼び出しが発生し、Chrome で F12 キーを押すと、次のエラー メッセージが表示されます。

angular.js:11821 OPTIONS http://localhost:56057/ContactsDatabaseAPI/deps net::ERR_CONNECTION_RESET

-1 の戻りステータスと、サーバー側への呼び出しの兆候はありません。

ヘッダー行がなくても問題なく動作します。

ヘッダーに同じ Authorization 値を指定してPostmanでGET 呼び出しを試みると、これも正常に機能します。

また、httpInterceptor にヘッダーを追加して、同じ結果を得ようとしました。

config.headers = config.headers || {};
config.headers.Authorization = 'Bearer ' + authData.token;

私が試した他のこと:

  • ランダムなヘッダー名でも同じ問題が発生します。
  • 'Content-Type' = 'text/plain;を追加しました。ヘッダーとしてcharset=utf-8' 。これは結果に変わりはありません

私はAngular 1.5.6を使用しています

4

2 に答える 2

2

これを試してください(コントローラーで):

$http.defaults.headers.common.Authorization = 'ベアラー' + トークン;

于 2016-10-21T15:54:57.107 に答える
0

問題を解決しました。正しい方向に向けてくれた @ Mourad-Idrissi に感謝します。

以前は機能していた理由は、API が実行される前にプリフライト チェックがなかったためです。ヘッダーを追加すると、クライアントが API に通信する方法が変わりました。現在、エラーの原因となっている API への OPTIONS 呼び出しがありました。ドメインが異なっていたので、これが CORS の世界を紹介してくれました。

バックエンド Web API の Application_BeginRequest() メソッドに以下を追加することで、プリフライトが成功し、アプリケーションが続行されます。

if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
{
    HttpContext.Current.Response.AddHeader("Cache-Control", "no-cache");
    HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST");
    HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept, Authorization");
    HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000");
    HttpContext.Current.Response.End();
}
于 2016-10-24T16:06:33.563 に答える