HTTPClient.PostAsync <t>,忽略XmlMediaTypeFormatter序列化属性</t>

时间:2013-02-07 00:05:19

标签: serialization httpwebrequest

我正在使用现有的xsd看起来像这样(为简洁起见缩短了):

<?xml version="1.0" encoding="utf-8"?>
<xs:schema targetNamespace="http://www.mycompany.com/Widgets"
    xmlns="http://www.mycompany.com/Widgets"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    elementFormDefault="qualified">
  <xs:element name="Widget" type="WidgetDefinition" />
  <xs:complexType name="WidgetDefinition">
    <xs:sequence>
        <xs:element name="name" type="xs:string"/>
    </xs:sequence>
  </xs:complexType> 
</xs:schema>

当您通过 xsd.exe 运行时,您会得到类定义,如:

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.mycompany.com/Widgets")]
[System.Xml.Serialization.XmlRootAttribute("Widget", Namespace="http://www.mycompany.com/Widgets", IsNullable=false)]
public partial class WidgetDefinition {
    private string nameField;

    public string Name {
      get {
          return this.nameField;
      }
      set {
          this.nameField = value;
      }
    }
}

快进......我正在使用 HTTPClient 来POST到REST服务。这里的代码非常简单。

var widget = new WidgetDefinition();
// do something here to hydrate widget
var httpClient = new HttpClient();
return httpClient.PostAsync<WidgetDefinition>(
    uri, terminatedCall, new XmlMediaTypeFormatter());

在接收端,我想获取请求有效负载并将其转换回WidgetDefinition对象。如果您使用以下方法检查请求内容:

request.Content.ReadAsStringAsync().Result

xml看起来像:

<WidgetDefinition xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://schemas.datacontract.org/2004/07/\">
...

根据生成的XmlTypeAttribute类的XmlRootAttributeWidgetDefinition属性,我希望它看起来像这样:

<Widget xmlns:i=\"http://www.mycompany.com/Widgets\">
...

在发送方进行序列化时,似乎忽略了XmlTypeAttributeXmlRootAttribute属性。

有什么可能导致这种情况的线索?

编辑:如果我使用XmlSerializer手动序列化它,它会服从WidgetDefinition类的序列化属性。我认为我的问题与传递给PostAsync调用的格式化程序有关。

1 个答案:

答案 0 :(得分:1)

xmlns=\"http://schemas.datacontract.org/2004/07/\"开始,您的REST服务似乎被配置为使用DataContractSerializer(WCF服务中的默认值)而不是XmlSerializer。

您可以将服务配置为使用XmlSerializer,这至少应该让您更进一步:

http://msdn.microsoft.com/en-us/library/ms733901.aspx