我正在使用PhoneGap设计一个Android应用程序,它基本上调用了一个Web服务,现在它将包含一个返回值(比如说一个字符串)作为返回值的方法。最后,我希望Web服务能够处理我将针对Windows Azure数据库执行的查询。
我选择的Web服务是启用Ajax的WCF服务。这是正确的选择吗?
我尝试了一个简单的应用程序,看看它是如何工作的。首先,我在Visual Studio中创建了一个新项目,然后创建了一个支持Ajax的WCF服务。我只添加了一个简单的方法:
[OperationContract]
[WebInvoke(Method = "GET", ResponseFormat= WebMessageFormat.Json)]
public string GetName()
{
return "Hello world";
}
我根本没有修改Web.config。
然后,我打开Eclipse并创建了一个新的PhoneGap Android应用程序,只有一个文本框和一个按钮。每次单击此按钮,将调用Web服务,并使用以下方法在文本框中显示返回值:
$('#button').click(function(){
$.ajax({
type: "GET",
url: "http://localhost:11634/MobileService.svc/GetName",
contentType: "application/json",
dataType: "json",
success: function (result) {
$("#textbox").text(result);
},
error: function (textStatus) {
$("#textbox").text(textStatus);
}
});
});
当我尝试使用此方法时,我在Firefox中遇到以下错误:"NetworkError: 405 Method Not Allowed
。然后我尝试将数据类型更改为jsonp
并在AJAX调用之前添加以下行以允许跨域请求:
$.support.cors = true;
。现在在Firefox中,我收到此错误:
SyntaxError: invalid label
{"d":"Hello world"}
请您指导我,我是否使用正确的方法以及如何处理跨域问题?
答案 0 :(得分:2)
您需要为jsonp调用添加回调函数。所以:
$('#button').click(function(){
$.ajax({
type: "GET",
url: "http://localhost:11634/MobileService.svc/GetName",
dataType: "jsonp",
jsonpCallback: "handleResponse",
error: function (textStatus) {
$("#textbox").text(textStatus);
}
});
});
function handleResponse(data) {
$("#textbox").text(data);
}
请参阅此问题:"invalid label" when using JSONP?
如下面的评论中所述,您需要设置MobileService以响应JSONP调用:
<system.serviceModel>
<behaviors>
<endpointBehaviors>
<behavior name="webHttpBehavior">
<webHttp />
</behavior>
</endpointBehaviors>
</behaviors>
<bindings>
<webHttpBinding>
<binding name="webHttpBindingWithJsonP" crossDomainScriptAccessEnabled="true" />
</webHttpBinding>
</bindings>
<services>
<service name="ServiceSite.MobileService">
<endpoint address="" binding="webHttpBinding"
bindingConfiguration="webHttpBindingWithJsonP"
contract="ServiceSite.MobileService"
behaviorConfiguration="webHttpBehavior"/>
</service>
</services>
</system.serviceModel>