JQuery $ .get从Self hosting Web API返回404 undefined

时间:2013-06-18 13:33:28

标签: jquery asp.net asp.net-web-api

我刚刚开始关注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好的 内容长度:405 Content-Type:application / xml;字符集= utf-8的 服务器:Microsoft-HTTPAPI / 2.0 日期:2013年6月19日星期三05:34:33 GMT

&LT; 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时,我在fiddler中看到以下内容

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

我花了一整天的谷歌搜索这个主题,似乎没有任何指向如何解决这个问题(在介绍级别)

2 个答案:

答案 0 :(得分:0)

像巴特说的那样,你“你可能会遇到同样的原始政策挑战”,也许是因为你在你的ajax查询中使用了端口8082而不是你的原始网址。你可以:

  • 不要使用该端口
  • 使用jsonp
  • 在原始页面中使用标题“Access-Control-Allow-Origin:”和“http://<my ip>:8082”并使用$ .ajax()“crossDomain”选项设置为true。

答案 1 :(得分: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;
        }

无论如何,谢谢其他人的贡献。