wsdlのプライベートフィールドを公開するwsdl.exeで生成されたWCFサービス
質問
WCFを使用してC#でwsdlおよびクライアントファーストの開発を行っており(wsdlとクライアントは既に存在し、サーバー側を構築しています)、奇妙な問題があります。 wsdl.exeを使用して.wsdlからコントラクトを生成し、それをビルドしてWCFサービスをWindowsサービスとしてホストできます。
ただし、 http:// localhost / Service?wsdl から取得したwsdlは、パブリックプロパティ(例: OsType
の代わりに、 m_OsTypeField
を取得します。これは、パブリック OsType
プロパティに関連付けられたプライベート変数です。)
この問題があるクラスの1つの属性は次のとおりです。
[System.CodeDom.Compiler.GeneratedCodeAttribute(" wsdl&quot ;," 2.0.50727.3038")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute(" code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace =" http://xxxxxxx.com/")]
.NET XMLシリアライザーはプライベートメンバーを無視することになっているため、完全に困惑しています。なぜこれが起こっているのかについてのアイデアはありますか?
解決
WCFを使用している場合、 wsdl.exe
を使用するのではなく、代わりに svcutil.exe
を使用する必要があります。
また、標準のWCF DataContractシリアライザーは、[DataMember]属性でマークしたものすべてを喜んでシリアル化します。.NET可視性設定は、データのSOAビューに影響しません。
ただし、コードサンプルからは、DataContractSerializerではなくXml Serializerを使用しているように見えます-おそらくsvcutil.exeではなくwsdl.exeを使用したためです。
svcutil.exeを使用してサーバー側スタブを作成できますか?それでも同じ問題が発生しますか?
マーク
他のヒント
データ契約ではXmlSerializerエンジンを使用していますが、OperationContractではDataContractSerializerを使用しています。
操作コントラクトでXmlSerializerFormatAttributeを適用します
MSDNから http://msdn.microsoft .com / en-us / library / ms732038(v = VS.90).aspx
場合によっては、DataContractSerializerが型をシリアル化するには不十分です。 WCFは、パラメーターのシリアル化にも使用できる代替のシリアル化エンジンであるXmlSerializerをサポートしています。 XmlSerializerを使用すると、XmlAttributeAttributeなどの属性を使用して、結果のXMLをより詳細に制御できます。特定の操作またはサービス全体でXmlSerializerを使用するように切り替えるには、XmlSerializerFormatAttribute属性を操作またはサービスに適用します。例:
[ServiceContract]
public interface IAirfareQuoteService
{
[OperationContract]
[XmlSerializerFormat]
float GetAirfare(Itinerary itinerary, DateTime date);
}
詳細については、XmlSerializerクラスの使用を参照してください。ここで示すように手動でXmlSerializerに切り替えることは、そのトピックで詳しく説明されているように、特別な理由がない限り推奨されないことに注意してください。