$.ajax({
url: 'https://XXXXX.desktop.XXXX.com:9011/iws-merchant/XXXXX.htm',
dataType: "jsonp",
success: function (response) {
str=response;
},
error: function( response ) {
alert( "ERROR: " + JSON.stringify );
}
});
总是进入错误块。我正在对不同的端口(同一域)进行AJAX调用。
但是当我尝试在新选项卡中点击相同的URL时。我可以看到响应。
您可以像Gaurav Agrawal建议的那样使用JSONP,或者您可以为接收ajax请求的站点启用Access-Control-Allow-Origin。
Ajax是这样工作的:同一域不同端口=不同域
如果你在ajax目标服务器上使用asp.net,你可以在web.config中启用访问控制:
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
</customHeaders>
</httpProtocol>
<system.webServer>
,帮自己一个忙,把"*"换成你的网站url!
在某些情况下,你甚至需要这些键,在添加它之前只需谷歌每个功能!
<add name="Access-Control-Allow-Headers" value="*" />
<add name="Access-Control-Allow-Methods" value="*" />
<add name="Access-Control-Allow-Credentials" value="true" />
<add name="Access-Control-Expose-Headers" value="*"/>
您不能使用JSON进行跨域AJAX调用。需要使用JSONP。因此,与其从控制器动作返回常规的JsonResult,不如编写自定义动作结果将JSON封装在回调函数中作为参数传递:
public class JsonpResult : ActionResult
{
private readonly object _obj;
public JsonpResult(object obj)
{
_obj = obj;
}
public override void ExecuteResult(ControllerContext context)
{
var serializer = new JavaScriptSerializer();
var callbackname = context.HttpContext.Request["callback"];
var jsonp = string.Format("{0}({1})", callbackname, serializer.Serialize(_obj));
var response = context.HttpContext.Response;
response.ContentType = "application/json";
response.Write(jsonp);
}
}
,然后让你的控制器动作返回这个自定义动作结果:
public ActionResult SomeAction()
{
var result = new[]
{
new { Id = 1, Name = "item 1" },
new { Id = 2, Name = "item 2" },
new { Id = 3, Name = "item 3" },
};
return new JsonpResult(balances);
}
现在你可以使用这个动作跨域:
var url = "http://example.com/SomeController/SomeAction/";
$.getJSON(url + '?callback=?', function (data) {
alert(data);
});