我刚刚开始关注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. "
我花了一整天的谷歌搜索这个主题,似乎没有任何指向如何解决这个问题(在介绍级别)
答案 0 :(得分:0)
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;
}
无论如何,谢谢其他人的贡献。