PhoneGap应用程序和WCF服务在不同的域上

时间:2012-10-17 08:46:27

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

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

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

1 个答案:

答案 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>