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 ヘッダーを自動的に更新しました)、同じエラーが発生しました。パラメータのタイプを文字列に変更し、リクエストを再度実行したところ、うまくいきました。だから私の問題は非文字列型のようです。