1

私は次のような既存の 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サービスにPOSTしています。ここのコードは非常に簡単です。

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およびXmlRootAttribute属性に基づいて、これは次のようになると思います。WidgetDefinition

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

シリアライゼーションが送信側で行われている場合、属性XmlTypeAttributeと属性は無視されるようです。XmlRootAttribute

これを引き起こしている可能性のある手がかりはありますか?

編集: XmlSerializer を使用してこれを手動でシリアル化すると、WidgetDefinition クラスのシリアル化属性に従います。私の問題は、PostAsync 呼び出しに渡されるフォーマッターに関係していると思います。

4

1 に答える 1

1

このxmlns=\"http://schemas.datacontract.org/2004/07/\"ことから、REST サービスは、XmlSerializer ではなく、DataContractSerializer (WCF サービスの既定値) を使用するように構成されているようです。

代わりに XmlSerializer を使用するようにサービスを構成できます。これにより、少なくとも先に進むことができます。

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

于 2013-02-07T17:23:53.707 に答える