3

今日のほとんどを、スタンドアロンの HTML ページでのクロス ドメイン ASP.Net MVC Web API 呼び出しへの jQuery ajax 呼び出しが適切な JSON データを返す理由を理解しようとしましたが、次のエラー メッセージが表示されます。私のajax呼び出しのエラー部分で:

オブジェクト { readyState=4, status=404, statusText="エラー", もっと...}

jQuery 2.0.3 を使用しています。これが私のajax呼び出しコードです:

    $.ajax
({
    type: "GET",
    beforeSend: function (xhr, settings)
    {
        xhr.setRequestHeader("Authorization", "95d11869-a2ad-4925-8a16-ee23c82909ac");
    },
    url: url,
    dataType: "json",
    processData: false,
    crossDomain: true,
    success: function (jsonFromServer)
    {
        alert(JSON.stringify(jsonFromServer));
    },
    error: function (xhr, textStatus, errorThrown)
    {
        if (typeof console === 'object' && typeof console.log === 'function')
        {
            console.log(xhr);
            console.log(textStatus);
            console.log(errorThrown);
        }
    }       
});

WEB API サービスへの呼び出しが 2 つの異なる方法で機能していることを検証できます。Fiddler 経由と、firebug のネットワーク トラフィック タブ経由です。どちらの方法でも、サーバーへの 2 つの異なる呼び出しが表示されます。プリフライトと実際のリクエストです。Fiddler は実際の JSON データの結果を表示し、JSLint に対してそれらを検証したところ、JSON は正しくフォーマットされています。私のサービスへのネットワーク トラフィック タブの 2 番目のエントリは 200 ステータスを示しますが、応答は空です。

これが私のリクエストヘッダーです:

GET /api/gamelist HTTP/1.1
Host: local.XXXXXX.com
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Authorization: 95d11869-a2ad-4925-8a16-ee23c82909ac
Referer: http://127.0.0.1:52148/index.html
Origin: http://127.0.0.1:52148
Connection: keep-alive

ここに私の応答ヘッダーがあります:

HTTP/1.1 200 OK
Cache-Control: no-cache, no-store
Pragma: no-cache
Content-Type: application/json; charset=utf-8
Expires: -1
Server: Microsoft-IIS/8.0
Access-Control-Allow-Origin: *
Access-Control-Allow-Origin: http://127.0.0.1:52148
X-AspNet-Version: 4.0.30319
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST, PUT, GET, DELETE, OPTIONS
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With
Access-Control-Max-Age: 86400
Date: Fri, 04 Oct 2013 20:22:43 GMT
Content-Length: 683

私は多くの投稿を読み、人々がうまくいくと言っている例を見てきました。何が間違っているのかわかりません。誰か洞察力がありますか?

アップデート

Firefox の WebDeveloper Network ツールをオンにして、リクエストの送信を監視しました。サーバーへの cros ドメイン呼び出しについて、次のように報告されていることに気付きました。

構文エラー: JSON.parse: 予期しないデータの終わりです。

フィドラー経由で取得したサービス呼び出しから返された JSON データは次のとおりです。

{"Player":{"PersonId":33,"PersonName":"Anonymous User","UserKey":"95D11869-A2AD-4925-8A16-EE23C82909AC","EmailAddress":"unknown"},"GameList":[{"GameId":17,"QuestionTypeId":1,"QuestionTypeName":"Baseball","QuestionId":6,"QuestionName":"Basbeball Team Names","GameTypeId":2,"GameTypeName":"Solo","TotalAvailablePoints":141,"StartDate":"2013-10-04T11:17:10.277","WhosTurnIsItId":33,"WhosTurnName":"Anonymous User"},{"GameId":18,"QuestionTypeId":1,"QuestionTypeName":"Baseball","QuestionId":3,"QuestionName":"World Series Winners","GameTypeId":2,"GameTypeName":"Solo","TotalAvailablePoints":149,"StartDate":"2013-10-04T11:17:10.277","WhosTurnIsItId":33,"WhosTurnName":"Anonymous User"}]}

この JSON を JSLint に貼り付けたところ、正しくフォーマットされていると表示されます。何が起こっているのかわかりません。洞察はありますか?

4

1 に答える 1

1

私もこの問題を抱えていて、次のように解決しました:

  • AJAX 呼び出しでdataType を から に変更し'json'ます。'jsonp'
  • この NuGet パッケージを Web API プロジェクトに追加します。WebApiContrib.Formatting.Jsonp
  • JsonpFormatterからこれを呼び出して を登録しGlobal.asaxます。

    configuration.Formatters.Insert(0, new JsonpMediaTypeFormatter(configuration.Formatters.JsonFormatter));
    

問題は、クロスドメイン AJAX 呼び出しで使用できる唯一の dataType である jsonp の読み方を Web API が認識していないことです。

于 2014-01-16T14:34:23.787 に答える