我正在使用一个看起来像这样的现有 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 发布到 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
and属性,我希望它看起来像:XmlRootAttribute
WidgetDefinition
<Widget xmlns:i=\"http://www.mycompany.com/Widgets\">
...
当序列化发生在发送端时,似乎XmlTypeAttribute
和属性被忽略了。XmlRootAttribute
任何线索可能导致这种情况?
编辑:如果我使用 XmlSerializer 手动序列化它,它会遵循 WidgetDefinition 类的序列化属性。我认为我的问题与传递给 PostAsync 调用的格式化程序有关。