c# - WCF WebInvoke JSON 反序列化失败 - 400 错误请求

标签 c# json wcf deserialization webinvoke

我在 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。为什么 webInvoke 不知道如何反序列化它或有任何其他错误?

最佳答案

我发现名为 CollectionDataContract 的魔法属性是个把戏。

添加新的集合类:

[CollectionDataContract(Namespace = "")]
public class MyFooCollection : List<MyFoo>
{
}

更改查询类

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

客户端代码更改:

MyFooCollection _collection = new MyFooCollection();
_collection.Add(_myFoo);
myOriginalFoo.FooArray = _collection; //new MyFoo[] { _myFoo };

现在所有变量都序列化了:)是的..需要很多时间才能弄清楚。

关于c# - WCF WebInvoke JSON 反序列化失败 - 400 错误请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19785116/

相关文章:

c# - WinRT C++(Win10)、opencv HSV色彩空间、图像显示、神器

c# - 不能在C#中以原始格式将PPT幻灯片中的形状复制到word文档中吗?

javascript - 如何使用 JSON-LD 标记面包屑列表中的最后一个非链接项

c# - 使用 Entity Framework 5 运行内联 SQL 并返回跟踪的实体

python - Python 2.2 或更早版本的最佳 json 库?

python - 将 ASCII 输出转换为 UTF-8

c# - WCF 序列化和缓存

c# - WCF 错误 : the client and service bindings may be mismatched?

wcf - WCF Code First DataServices 可以返回 NotMapped 属性吗?

c# - 帖子上的模型属性为空