2

WebServiceHost 内で WCF .NET 4.0 ホスティングを使用しています。クラス内で独自の定義済みクラス配列を使用するまで、通常はすべて機能します。

サーバーサイド機能

[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, UriTemplate = "foo")]
[OperationContract]
void Foo(FooQuery query);

クラス

[DataContract(Namespace="")]
public class FooQuery
{
    [DataMember]
    public MyFoo[] FooArray;
}

[DataContract(Namespace = "")]
public class MyFoo
{
    [DataMember]
    public string[] items;
}

クライアント側:

        //create object
        FooQuery myOriginalFoo = new FooQuery();
        MyFoo _myFoo = new MyFoo();
        _myFoo.items = new string[] { "one", "two" };
        myOriginalFoo.FooArray = new MyFoo[] { _myFoo };

        //serialize
        var json = new JavaScriptSerializer().Serialize(myOriginalFoo);
        string _text = json.ToString();
        //output:
        // {"FooArray":[{"items":["one","two"]}]}

        var httpWebRequest = (HttpWebRequest)WebRequest.Create("http://localhost:2213/foo");
        httpWebRequest.ContentType = "application/json";
        httpWebRequest.Method = "POST";

        using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
        {
            streamWriter.Write(_text);
            streamWriter.Flush();
            streamWriter.Close();
        }

        //here server give back: 400 Bad Request.
        var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();

また、System.Runtime.Serialization.Json.DataContractJsonSerializer を使用してクラスを操作しようとしました。サーバーに送信して webinvoke がエラー 400 を返すまでは問題ありません。

4

3 に答える 3

0

これは Web リクエストなので、代わりに GET を試してください。

[WebGet(ResponseFormat = WebMessageFormat.Json)]
于 2013-11-05T09:49:45.260 に答える
0

WCF サービスがラップされた JSON 文字列を予期するようにするには、以下のように WebMessageBodyStyle を WrappedRequest に設定します。デフォルトでは、プレーンな文字列が必要です。

 [WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest)]
于 2013-11-05T10:30:28.140 に答える