使用C#和WFC的跨域jQuery Ajax
我有一个用C#和WCF编写的小型Web服务 我有一点jQuery代码使用C#和WFC的跨域jQuery Ajax,c#,web-services,jquery,jquery-mobile,cordova,C#,Web Services,Jquery,Jquery Mobile,Cordova,我有一个用C#和WCF编写的小型Web服务 我有一点jQuery代码 $.support.cors = true; $.ajax({ type: "POST", url: "http://localhost:61614/Service1.asmx/HelloWorld", data: '{}', dataType: "json", succes
$.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”
会导致整个调用失败。
使用数据类型:“jsonp”
会导致调用失败
基本上,上面调用WS-but返回时出错,这很奇怪
我的要求是需要从webservice返回一个JSON对象,它必须在Safari中工作
有人有完整的JSONP调用示例代码吗?来自:
如果URL包含字符串“callback=?”(或服务器端API定义的类似字符串),则请求将被视为JSONP。有关详细信息,请参阅$.ajax()中对JSONP数据类型的讨论
为了将您的请求视为JSONP请求,您需要在URL中包含callback=?
。这会告诉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的警报消息,以及从属性中提取的单词“HelloWorld”。来自:
如果URL包含字符串“callback=?”(或服务器端API定义的类似字符串),则请求将被视为JSONP。有关详细信息,请参阅$.ajax()中对JSONP数据类型的讨论
为了将您的请求视为JSONP请求,您需要在URL中包含callback=?
。这会告诉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的警报消息,以及从属性中提取的单词“HelloWorld”。不确定它是否有帮助@griegs-第一步,确保在浏览器中返回如下所示的JavaScript函数:test({'say':'HelloWorld'));
。除非您这样做,否则jsonp请求将不会成功。您可以在地址栏中进行测试。希望这有帮助。需要澄清的一点是,您是否100%确定在上线后会跨域发出请求?如果是同一个域,那么您可以返回JSON而不使用填充/包装函数。不确定它是否有帮助@griegs-F第一步,确保在浏览器中返回如下所示的JavaScript函数:test({'say':'HelloWorld'})
。除非您这样做,否则jsonp请求将不会成功。您可以在地址栏中进行测试。希望这有帮助。有一件事需要澄清。您是否100%确定在上线后会跨域发出请求?如果是同一个域,那么您只需返回JSON而不需要填充/包装函数。jmort253,这仍然不是calli由于某种原因正在关闭web服务。是否返回test({'say':'HelloWorld});
在浏览器中?如果不是,这是第一步。它基本上是动态生成的文本/javascript。请先尝试一下。这是一个更复杂的JSONP示例,但它应该让您了解在浏览器中点击URL时需要看到什么。请注意JSON对象是如何包装在名为“test”的函数中的“:这是我返回的返回”({'data':'Hello Worlds'})”;这些都是.NET和JSON请求的明显缺陷。请参阅本文。我还将更新我的答案以反映解决方法。但是,了解您是否需要跨域JSONP(我正在从example.com向domain.com的服务器发出请求)或只是普通JSON(我正在发出请求)非常重要