不同域上的 PhoneGap 应用程序和 WCF 服务
Posted
技术标签:
【中文标题】不同域上的 PhoneGap 应用程序和 WCF 服务【英文标题】:PhoneGap application and WCF service on different domains 【发布时间】:2012-10-07 11:34:17 【问题描述】:我正在使用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-service,并使用以下方法将返回值显示在文本框中:
$('#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"
您能否指导我,我是否使用了正确的方法以及如何处理跨域问题?
【问题讨论】:
【参考方案1】:您需要为 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?
如下面的 cmets 所述,您需要设置 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>
【讨论】:
即使我执行了 jsonpCallback,我仍然收到无效标签错误。 您可以使用 Firefox 或 Chrome 转到上面的 localhost url,然后使用调试器(Firefox 中的 Firebug 或 Chrome 中的开发人员工具)来显示 JSON 响应的样子吗?听起来返回的 JSON 中有一些无效的内容。 如果响应格式不正确,您的 Web.config 可能需要针对 JSONP 进行更改,或者您可能需要为服务创建特定的工厂。查看此问题的答案:***.com/questions/9882857/… 问题是如果它是 JSONP,它应该作为函数调用返回:handleResponse("d":"Hi")
所以服务器端没有正确处理 JSONP。当 ajax 收到它时,它会抱怨。当您使用 WCF 4 时,本文似乎展示了如何尽可能轻松地在 WCF 端添加 JSONP:bendewey.com/blog/index.php/186/using-jsonp-with-wcf-and-jquery
感谢您的帮助@mccannf。我尝试了另一种方法并使用了跨域wcf服务并正常使用json以上是关于不同域上的 PhoneGap 应用程序和 WCF 服务的主要内容,如果未能解决你的问题,请参考以下文章
通过不同域上的 REST Web 服务进行用户身份验证 - asp.net