编辑:起初我认为它根本不是跨域工作,现在我意识到它只适用于IE
我正在使用jQuery来调用Web服务(ASP.NET .axmx
),并尝试向我们jsonp
进行调用,以便我可以在不同的站点上调用它。目前它只在IE中工作,但不适用于Firefox,Chrome,Safari。此外,在IE中,会弹出一个对话框,警告“此页面正在访问不受其控制的信息......”
有任何想法吗?
以下是代码:
$.ajax({
type: "POST",
url: "http://test/TestService.asmx/HelloWorld?jsonp=?",
dataType: "jsonp",
success: function(data) {
alert(data.prop1);
},
error: function(XMLHttpRequest, textStatus, errorThrown) {
alert(XMLHttpRequest.status + " " + textStatus + " " + errorThrown);
}
});
服务器代码是:
[ScriptService]
public class TestService : System.Web.Services.WebService{
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public void HelloWorld() {
string jsoncallback = HttpContext.Current.Request["jsonp"];
var response = string.Format("{0}({1});", jsoncallback, @"{'prop1' : '" + DateTime.Now.ToString() + "'}");
HttpContext.Current.Response.Write(response);
}
}
答案 0 :(得分:2)
很高兴它现在正在工作。
您正在尝试发送参数“jsonp” - 您需要传递json的“padding”部分 - 作为GET参数,即在URL字符串中。这是正确的做法。
但是因为你已经指定了POST,所以没有发生。实际上,因为您正在指定POST,所以服务器期望所有参数都在POSTed数据中,而不是在GET变量中,因此它不会检查URL以检索参数。
我认为jQuery可能对它如何进行JSON评估非常宽容/聪明,因此仍在IE中工作,因为(a)如果服务器没有读取“jsonp”变量,我认为将发送回"({'prop1' : '<today's date>'})"
,它仍然可以作为JSON进行评估,并且(b)IE对其他浏览器的跨站点脚本(“同源”策略)没有相同的限制。但我需要调试它才能确定。
我建议在Firefox中使用FireBug来调试将来发生此类请求的情况,但主要的一点是,如果您要将参数作为URL的一部分发送,请使用GET,而不是POST
干杯,
马特
答案 1 :(得分:0)
除非您指定jsonp
和/或jsonpCallback
选项,否则jQuery会自动为您生成函数名称,并添加一个查询参数,如callback=jsonp1272468155143
。这意味着您的应用程序需要使用该函数名输出。
您始终可以将jsonpCallback
设置为test
,在这种情况下,您的示例就可以使用。