1

私は PhoneGap を使用して Android 用のアプリケーションを設計しています。これは基本的に Web サービスを呼び出しますが、今のところ、戻り値として何か (文字列としましょう) を返すメソッドが含まれます。最後に、Windows Azure データベースに対して実行するクエリを Web サービスで処理できるようにします。

私が選んだ Web サービスは、Ajax 対応の WCF サービスでした。これは正しい選択でしたか?

これがどのように機能するかを確認するために、簡単なアプリケーションを試しました。まず、Visual Studio で新しいプロジェクトを作成し、次に Ajax 対応の WCF サービスを作成しました。簡単なメソッドを 1 つだけ追加しました。

[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 Allowedjsonp次に、クロス ドメイン リクエストを許可するために 、データ型を に変更して、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 を使用する場合の「無効なラベル」?

以下のコメントで説明されているように、JSONP 呼び出しに応答するように MobileService を設定する必要があります。

<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 に答える