【问题标题】:PhoneGap application and WCF service on different domains不同域上的 PhoneGap 应用程序和 WCF 服务
【发布时间】: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"}

您能否指导我,我是否使用了正确的方法以及如何处理跨域问题?

【问题讨论】:

    标签: jquery ajax wcf web-services cross-domain


    【解决方案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 进行更改,或者您可能需要为服务创建特定的工厂。查看此问题的答案:stackoverflow.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
    猜你喜欢
    • 1970-01-01
    • 2013-09-30
    • 1970-01-01
    • 1970-01-01
    • 2011-10-10
    • 1970-01-01
    • 2013-11-25
    • 2013-02-03
    • 2014-01-09
    相关资源
    最近更新 更多