4

私は web-api を見始めたばかりで、小さな自己ホスティング プロジェクトをセットアップしました。基本的なコントローラーをセットアップし、ブラウザーでポイントしようとすると結果が返されました。

今、jquery.getを使ってそれを呼び出そうとすると

例えば

$.get("http://<my ip>:8082/api/stats/single/1/i")                 
    .done(function(result) {
        alert("results");
     })
    .error(function(result) { 
       alert(result.status + " " + result.responseText); }
 );};

エラーが発生します (404 undefined)

上記の結果をフィドルで見ると、期待どおりのjson結果が表示され、生のヘッダーは次のとおりです...

 HTTP/1.1 200 OK
 Content-Length: 415
 Content-Type: application/json; charset=utf-8
 Server: Microsoft-HTTPAPI/2.0
 Date: Tue, 18 Jun 2013 13:04:03 GMT

テスト データを提供することがわかっている別のリモート サーバーで jquery を試すと、.get は正しく返されます。このサーバーからの生のヘッダーにはもっと多くのものがあることに気付きました...

  HTTP/1.1 200 OK
  Cache-Control: no-cache 
  Pragma: no-cache
  Content-Length: 431
  Content-Type: application/json; charset=utf-8
  Content-Encoding: gzip
  Expires: -1
  Vary: Accept-Encoding
  Server: Microsoft-IIS/8.0
  Set-Cookie:   ARRAffinity=462716b27beb795c09df205e893d3e263b1ec9b710c92f7c4203f4b63ac1aed2;Path=/;Domain=sampleservices.devexpress.com
   Set-Cookie: ASP.NET_SessionId=j4sdehjie1h0cv2rukxnudw3; path=/; HttpOnly
   Access-Control-Allow-Origin: null
   Access-Control-Allow-Credentials: true
   X-AspNet-Version: 4.0.30319
   X-Powered-By: ASP.NET
   X-Powered-By: ARR/2.5
   X-Powered-By: ASP.NET
   Set-Cookie: WAWebSiteSID=14a8502027ea4cc3a9e65036ed421c5e; Path=/; HttpOnly
   Date: Tue, 18 Jun 2013 13:26:52 GMT

私の web-api テストが $.get??

(質問への回答)..

クロムでクエリを使用すると、

HTTP/1.1 200 OK Content-Length: 405 Content-Type: アプリケーション/xml; charset=utf-8 サーバー: Microsoft-HTTPAPI/2.0 日付: 2013 年 6 月 19 日水曜日 05:34:33 GMT

<ArrayOfStateController.State xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/WebApiEquipmentStatus"><StateController.State><Description>state1 description</Description><Name>state1</Name></StateController.State><StateController.State><Description>state2 description</Description><Name>state2</Name></StateController.State></ArrayOfStateController.State>

そしてjqueryを実行すると、フィドラーで次のように表示されます

HTTP/1.1 200 OK
Content-Length: 107
Content-Type: application/json; charset=utf-8
Server: Microsoft-HTTPAPI/2.0
Date: Wed, 19 Jun 2013 05:35:58 GMT

[{"Name":"state1","Description":"state1 description"},{"Name":"state2","Description":"state2 description"}]

[編集]

提案から、私は以下を試しました..

 enter code here


enter code here
$.ajax.crossDomain = true;          
                    getSingle = function () {
                        $.getJSON("http://<ip>/api/state/single/1/i?callback=process", 
                            {header: 'Access-Control-Allow-Origin: *'})
                            .done(function (result) {
                                var process = function(data) {
                                    $("#results").text(data.toString());
                                };

                            })
                            .error(function (result) {
                                $("#results").text(result.status + " " + result.responseText);
                            });
                    };

Chrome コンソール ウィンドウを見ると、まだ

"XMLHttpRequest cannot load http://<ip>:8082/api/state/single/1/i?callback=process. Origin null is not allowed by Access-Control-Allow-Origin. "

私は一日中この件についてグーグルで調べましたが、これを解決する方法を示すものは何もないようです(イントロレベルで)

4

2 に答える 2

0

こんにちは、ついにこれが機能しました。

web-api を初めて使用するので、知りたいのはこのヘッダー情報を設定する方法だけでした。必要なのは、結果を返すだけではなく、HttpResponseMessage でラップして返すことだけでした。

const string AccessControlAllowOrigin = "Access-Control-Allow-Origin";

public HttpResponseMessage GetAllProducts()
        {          
          var results = GetProducts();
          HttpResponseMessage  response = Request.CreateResponse(HttpStatusCode.OK, results);
          response.Headers.Add(AccessControlAllowOrigin, "*");
          return response;
        }

他の方の貢献に感謝します。

于 2013-06-29T09:18:41.773 に答える
0

バートが言ったように、「呼び出しで同じオリジン ポリシーの課題に遭遇する可能性があります」。おそらく、オリジン URL ではなく ajax クエリでポート 8082 を使用しているためです。あなたはできる:

  • そのポートを使用しないでください
  • jsonpを使用する
  • 元のページでヘッダー「Access-Control-Allow-Origin:」を「」とともにhttp://<my ip>:8082使用し、$.ajax()「crossDomain」オプションを true に設定して使用します。
于 2013-06-19T12:53:40.770 に答える