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 未定义)

如果我在小提琴中查看上面的结果,我确实看到了我期望的 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 的调用一起工作吗?

(回答问题)..

当我在 chrome 中使用我的查询时,我得到

HTTP/1.1 200 OK 内容长度:405 内容类型:应用程序/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

就像 Bart 说的那样,您“您可能会在调用时遇到相同的来源策略挑战”,这可能是因为您在 ajax 查询中使用了端口 8082,而不是在您的来源 url 中。你可以:

  • 不要使用那个端口
  • 使用 jsonp
  • 在原始页面中使用带有“”的标题“Access-Control-Allow-Origin:”并http://<my ip>:8082使用 $.ajax()“crossDomain”选项设置为 true。
于 2013-06-19T12:53:40.770 回答
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 回答