1

iOS から WCF でサービス操作を呼び出すにはどうすればよいですか?

iOS から呼び出す必要がある WCF データ サービス (DB スキーマのストアド プロシージャに関連付けられている) で定義されたサービス操作があります。.svc.csファイルに次の宣言があるとします。

[WebInvoke(RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest)]
public IQueryable<Foo> GetFoos(int param1, DateTime param2, string param3)
{
  return CurrentDataSource.GetFoos(param1, param2, param3).AsQueryable();
}

そして、私はそれを適切な権利でセットアップしましたInitializeService:

config.SetServiceOperationAccessRule("GetFoos", ServiceOperationRights.AllRead);

iOS から HTTP POST 経由でこれを呼び出そうとすると、JSON でラップされたエラーが返されます。

不正なリクエスト - クエリ構文のエラー。

パラメータを渡す方法が気に入らないようです。POST リクエストのリクエスト本文で、JSON エンコードされたもの ( を JSON 文字列に変換するために使用)NSJSONSerializationを渡しています。同じメソッドは、同じように注釈が付けられた操作を持つ WCF に接続されていないNSDictionary別の Web サービス ( ) でも機能します。.svc

同様の質問に対する私の別の質問への回答は、クライアントとサーバーの間でデータ形式をネゴシエートできることを示唆していますDateTime\/Date(836438400000)\/しかし、JSON 形式 (と/Date(836438400000)/) と JSON Light 形式 ( ) の両方を試しましたが、うまくいきませ1996-07-16T00:00:00んでした。

だから私の質問はこれです:この操作を呼び出す適切な方法は何ですか? アプリでサーバーに期待する形式を伝える必要がある場合、どのようにすればよいですか?

更新:この質問datetime'1996-07-16T00:00:00'に記載されている形式を使用してみました。同じエラー。

更新 2 : サービス操作のMSDN ページは、サービス操作Method = "POST"の注釈を付けるときにサポートされているもの以外は何もサポートされていないようWebInvokeです。上記のコードで引用されているものからすべてを削除し、メソッドを POST に設定しようとしました。同じエラー。

更新 3 : Pawel の提案で、次のようにデータ サービスに新しいサービス操作を作成しました。

[WebInvoke(Method = "POST")]
public IQueryable<string> GetFoos()
{
    List<string> foos = new List<string>();
    foos.Add("bar");
    return foos.AsQueryable();
}

メソッドを POST に設定し、ヘッダーにaccept:application/json;charset=utf-8とを追加することで、Fiddler の Composer ペインで機能させることができました。Content-Length:0次に、単一の int パラメーターを操作に追加しました (param1 と呼ばれます)。Fiddler でリクエストの本文を に設定して{"param1":"1"}実行しました (そして、Fiddler は content-length ヘッダーを自動的に更新しました)、同じエラーが発生しました。パラメータのタイプを文字列に変更し、リクエストを再度実行したところ、うまくいきました。だから私の問題は非文字列型のようです。

4

1 に答える 1

0

リクエスト本文ではなく、URL でパラメーターを送信する必要があります。

于 2012-09-27T22:53:42.437 に答える