不同域上的 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

将事件发送到不同域上的 iFrame?

同一域上的不同页面显示不同的 cookie(按目标域)

托管在不同域上的 JavaScript 可以读取/修改另一个域的 DOM 吗?

同一域上的国家/地区明智的 wordpress 网站

CORS 和 phonegap 应用程序