jsonp跨域仅在IE中工作

时间:2010-04-28 15:23:54

标签: asp.net jquery web-services jsonp

编辑:起初我认为它根本不是跨域工作,现在我意识到它只适用于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);
    }
}

2 个答案:

答案 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,在这种情况下,您的示例就可以使用。