2

我有一个用 C# 和 WCF 编写的小型 Web 服务。

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.Web.Script.Services.ScriptService]
public class Service1 : System.Web.Services.WebService
{
    [WebMethod]
    public string HelloWorld()
    {
        return "Hello Worlds";
    }
}

我有一点 jQuery 代码;

        $.support.cors = true;

        $.ajax({
            type: "POST",
            url: "http://localhost:61614/Service1.asmx/HelloWorld",
            data: '{}',
            dataType: "json",
            success: function (msg) {
                alert(0);
            }, error: function (a, b, c) { alert("Err:" + c ); 
            }
        });

这将调用 web 服务。拨打电话没有问题,但返回时出错。

Web 服务在一个应用程序中,而 Web 页面本身就是一个 HTML 页面。最终,HTML 将在 PhoneGap 中使用。

我已经尝试了各种各样的事情。

添加contentType: "application/json; charset=utf-8",会导致整个调用失败。使用dataType: 'jsonp"会导致调用失败。

基本上,上面调用了 WS,但返回时出错,这很奇怪。

我的要求是我需要从 web 服务返回一个 JSON 对象,并且它必须在 Safari 中工作。

有没有人有完整的 JSONP 调用示例代码?

4

1 回答 1

0

jQuery getJSON

如果 URL 包含字符串“callback=?” (或类似的,由服务器端 API 定义),请求被视为 JSONP。有关详细信息,请参阅 $.ajax() 中对 jsonp 数据类型的讨论。

为了让您的请求被视为 JSONP 请求,您需要包含callback=?在您的 URL 中。这告诉 jQuery 创建一个回调函数并将该函数的名称作为回调参数传递给您的服务器。

在服务器端代码中,您的方法必须返回包装或填充的 JSON 代码,其中 JavaScript 函数的名称作为查询字符串中的回调参数传入。

本质上,您所做的是将 JavaScript 返回到客户端浏览器,该浏览器立即运行,并调用已在页面上下文中定义的函数。

JavaScript:

$.getJSON("http://localhost:61614/Service1.asmx/HelloWorld?callback=?",
    function(data) {

        // alert raw JSON data
        alert(JSON.stringify(data));

        // access the "say" property and alert it
        alert(data.say);
    }
);

服务器端:

这是您需要在服务器端执行的操作的粗略版本:

// get the callback parameter value and assign to the String callback
...
return callback + "( { 'say' : 'HelloWorld' } );";

对幕后发生的事情的进一步技术解释:

虽然这不是您今天需要了解的内容,但这可能会帮助您更多地了解 jQuery 是如何实现 JSONP 的。

这评估为可能看起来像这样的东西:

return "jquery43214321432143242({'say':'HelloWorld'});"

jquery43214321432143242为您的成功回调函数提供的随机名称在哪里。同样,由于返回的文本是使用 text/javascript 返回的,所以它会立即运行,将{'say':'HelloWorld'}对象作为参数传递给函数。

结果输出应该是表示原始 JSON 的警报消息,以及从.say属性中提取的单词“HelloWorld”。

于 2012-05-06T23:47:40.747 回答