1

我正在使用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"}

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

4

1 回答 1

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);     
}

看到这个问题:使用 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>
于 2012-10-17T10:14:13.737 回答