1

DataContact/DataMember 属性を使用して WCF サービスを公開すると、他のプロジェクトでこのサービスに対して行う各サービス参照によって、DataContract/DataMember 属性 (および IExtensibleDataObject インターフェイス実装など) を持つクラスが生成されます。

別のプロジェクトでは、WSDL が WCF によって生成されていない SOAP サービスを使用する必要がありますが、他のツールによっては不明であり、動作を変更することはできません。

私の問題は、svcutil プロキシによって生成されたコードの柔軟性が少し低いことです。

  • クラスは、DataContract の代わりに Serializable 属性を使用します (GeneratedCode 属性は、System.Runtime.Serialization の代わりに System.Xml の使用を指定します)。
  • IExtensibleDataObject が実装されていません
  • OptionalField 属性は使用されません
  • XmlElement の順序が固定されているため、新しい xs:element が wsdl xs:sequence の途中に挿入されると、逆シリアル化が失敗します...

この方法でコードを生成する必要がある svcutil ツール/私が使用する wsdl で何が起こったのですか?

4

1 に答える 1

1

私が使用しているsvcutilツール/wsdlで何が起こったのでしょうか。この方法でコードを生成する必要がありますか?

Svcutil.exeツールを使用して、WCFサービスとASMXサービスの両方のクライアントプロキシを作成できます。Svcutil.exeを使用してASMXサービスからプロキシを作成する場合、コードで生成されるデータ型は通常XMLシリアル化を使用します。

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

アップデート:

私の推測では、WSDLで指定されたスキーマによって、svcutil.exeが使用する必要のあるシリアル化が決まります。

データコントラクトシリアル化スキーマの名前空間はhttp://schemas.microsoft.com/2003/10/Serializationであり、ここで詳細を確認できます。

したがって、svcutilがwsdlで指定されたこのスキーマを確認した場合は、データコントラクトシリアライザーを使用します。それ以外の場合は、xmlシリアライザーを使用します。

WCFとASMXのWSDLも確認しました。WCFサービスのWSDLには次のXSDセクションが含まれていますが、ASMXのセクションにはありません。

<xsd:schema targetNamespace="http://tempuri.org/Imports">

   <xsd:import schemaLocation="http://localhost:53328/Service1.svc?xsd=xsd0"
     namespace="http://tempuri.org/"/>

   <xsd:import schemaLocation="http://localhost:53328/Service1.svc?xsd=xsd1" 
     namespace="http://schemas.microsoft.com/2003/10/Serialization/"/>

   <xsd:import schemaLocation="http://localhost:53328/Service1.svc?xsd=xsd2" 
      namespace="http://schemas.datacontract.org/2004/07/WcfService1"/>
</xsd:schema>
于 2012-06-14T14:41:57.683 に答える