2

複雑な型を入力として受け取る REST & json ベースの WCF サービスを構築しようとしています。クライアントでは、WCF REST スターター キットの一部として提供される HttpClient を使用して、このサービスを利用しようとしています。

以下は私のサービスコードです:

[WebInvoke(Method = "POST", UriTemplate = "/SendData", BodyStyle = WebMessageBodyStyle.Wrapped)]
public void SendData(List<EditorData> input)
{
//Do something
}

WebMessageBodyStyle 列挙型にある他のオプションを使用しましたが、役に立ちませんでした。

これは、クライアントでも使用している複雑な型のデータ コントラクトです。

public class EditorData
{
    public string key { get; set; }
    public long quesno { get; set; }
    public string quescontent { get; set; }
}

クライアントコード:

List<EditorData> listEditor = new List<EditorData> { new EditorData { key = "key1", quescontent = "qcontent1", quesno = 1},new EditorData { key = "key2", quescontent = "qcontent2", quesno = 2}};
string jsonEditorList = listEditor.ToJSON();
HttpClient client = new HttpClient("http://localhost/RestWcfService/RestService.svc/");
client.DefaultHeaders.Accept.Add("application/json");
HttpResponseMessage response = null;
response = client.Post("SendData", HttpContent.Create(jsonEditorList));
response.EnsureStatusIsSuccessful();

カスタム オブジェクト リストを json 文字列に変換するために、ここで見つけた拡張メソッドを使用しています。

このアプリケーションを実行すると、次のエラーが表示されます。

BadRequest (400) is not one of the following: OK (200), Created (201), Accepted (202), NonAuthoritativeInformation (203), NoContent (204), ResetContent (205), PartialContent (206)

何かご意見は?

編集:

フィドラーのスクリーンショットは次のとおりです。

ここに画像の説明を入力

アップデート:

Jason Freitas の提案に従って、フィドラーで応答を確認しました。これは言うことです:

The server encountered an error processing the request. See server logs for more details.

だから私はIISログに行きました.IISに記録されたエラーは次のとおりです:

2012-02-15 13:20:08 fe80::ecdd:d2dd:7f70:bef6%11 POST /RestWcfService/RestService.svc/SendData - 80 - fe80::ecdd:d2dd:7f70:bef6%11 - 400 0 0 0

更新 2

Rajesh の提案に従って、wcf サービスのトレースを有効にしました。以下は、サーバーによってスローされる例外です。

The incoming message has an unexpected message format 'Raw'. The expected message formats for the operation are 'Xml', 'Json'. This can be because a WebContentTypeMapper has not been configured on the binding. See the documentation of WebContentTypeMapper for more details.

コンテンツ タイプを json として指定した場合、どのように Raw 形式になるのかまだわかりません。

4

2 に答える 2

4

まず、WCF サービスでトレースを有効にして、400 の不正な要求エラーの正確な原因を確認してください。

投稿されている入力の形式が間違っているようです。メソッドへのパラメーターとして EditorData のリストを定義し、いくつかのキーと値のペアを投稿しました (フィドラーのスクリーンショットを参照)。逆シリアル化されたときにフィドラーの json 文字列が EditorData オブジェクトのリストに変換されることを確認してください。

また、ボディ スタイルをラップするように設定しました。それを削除して、機能するかどうかを確認してください。ラップされたリクエストは、複数のパラメーターがある場合に使用されます。その場合、すべてのパラメーターをメソッド名要素内にラップして、ネットワーク経由で送信します。

アップデート:

以下に示すように、必ず Content-Type をヘッダーに追加してください。

client.DefaultHeaders.ContentType = "application/json";
于 2012-02-15T09:51:42.707 に答える
0

[WebInvoke]デフォルトは XML シリアライゼーションです。データを JSON として送信していることを伝える必要があります。このように WebInvoke 属性に RequestFormat を設定します

RequestFormat = WebMessageFormat.Json

于 2012-02-15T08:50:33.827 に答える