Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WCF终结点未正确序列化XML_C#_Xml_Json_Wcf - Fatal编程技术网

C# WCF终结点未正确序列化XML

C# WCF终结点未正确序列化XML,c#,xml,json,wcf,C#,Xml,Json,Wcf,我有一个WCF端点在。实现看起来有点像这样: [OperationContract] [WebInvoke( Method = "POST", BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "Test")] void TestEndpoint(Test test); 我在别处声明了一些数据对象 [DataContract] public class TestBase { [DataMember(Name

我有一个WCF端点在。实现看起来有点像这样:

[OperationContract]
[WebInvoke(
    Method = "POST",
    BodyStyle = WebMessageBodyStyle.Bare,
    UriTemplate = "Test")]
void TestEndpoint(Test test);
我在别处声明了一些数据对象

[DataContract]
public class TestBase
{
    [DataMember(Name = "BaseValue")]
    public string BaseValue { get; set; }
}
[DataContract(Namespace = "")]
public class Test : TestBase
{
    [DataMember(Name = "TestValue")]
    public string TestValue { get; set; }
}
我遇到的问题是,当我调用端点并通过请求体传递对象数据时,只有在使用JSON时,数据才被正确序列化,而不是在使用XML时

以下内容将非常有用。Test.TestValue==“TestValue”和Test.BaseValue==“BaseValue”

当我执行以下Test.TestValue==“TestValue”和Test.BaseValue==null时:(

POSThttp://localhost:8090/api/Test 
内容类型:text/xml
试验基地

你知道我做错了什么吗?

首先,你需要把基类和派生类放在同一个名称空间中:

[DataContract(Namespace = "")]
public class TestBase
{
    [DataMember(Name = "BaseValue")]
    public string BaseValue { get; set; }
}
如果不这样做,
BaseValue
实际上将位于不同的命名空间中,即数据协定序列化程序选择的默认命名空间:

<Test xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <BaseValue xmlns="http://schemas.datacontract.org/2004/07/ClrNamespace">foo</BaseValue>
    <TestValue>bar</TestValue>
</Test>

在发布这篇文章之前,我已经尝试将名称空间添加到TestBase中,并得到了相同的结果。我不知道XML顺序对这一点有任何影响。你让我开心了!谢谢。
[DataContract(Namespace = "")]
public class TestBase
{
    [DataMember(Name = "BaseValue")]
    public string BaseValue { get; set; }
}
<Test xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <BaseValue xmlns="http://schemas.datacontract.org/2004/07/ClrNamespace">foo</BaseValue>
    <TestValue>bar</TestValue>
</Test>
<Test>  <BaseValue>Base</BaseValue> <TestValue>Test</TestValue>  </Test>