0

その場でカスタム WCF wsdl をビルドするコードがあります。1 つの特定のシナリオでは、エクスポートされる WSDL は、デフォルトの DataContractSerializerOperationBehavior IWsdlExportExtension ではなく、XmlSerializerOperationBehavior を IWsdlExportExtension として使用する必要があります。

ただし、WSDL 生成コードからこれを試みるたびに、XmlSerializerMessageContractExporter の ExportBody メソッド (XmlSerializerOperationBehavior ExportContract メソッドによって System.ServiceModel で内部的に使用される) から null 参照例外が発生します。私はそれを反射させましたが、明らかに間違っているものは何も見えません。何らかの理由で、.NET もこのシナリオでソースのステッピングを使用したくありません...

簡単に言えば、これを再現できる最も基本的な方法は

var c = ContractDescription.GetContract(typeof(IMyService));
foreach (var op in c.Operations)
{
  op.Behaviors.Remove(typeof(DataContractSerializerOperationBehavior));
  op.Behaviors.Insert(0, new XmlSerializerOperationBehavior(op));
}

new WsdlExporter().ExportContract(c); // throws NullReferenceException

誰かがこれについて何か考えを持っていますか?

どうもありがとう。

4

2 に答える 2

0

c が null でないことを確認しましたか?

私が考えることができる唯一の他のことは、このステートメントです

new WsdlExporter().ExportContract(c);

多分コンパイラはそれを好まないでしょう、代わりにこれを試してください

WsdlExporter wsdlImporter = new WsdlExporter()
wsdlImporter.ExportContract(c);

過去に wcf と連鎖操作のシナリオがありましたが、解決策は呼び出しの連鎖を解除することでした。

于 2010-04-02T10:49:40.913 に答える
0

私はそれを考え出した。問題は、XmlSerializerFormatAttribute が ServiceContract インターフェイス自体に存在しない場合、XmlSerializerOperationBehavior が null 参照例外をスローすることです。それを理解するために全体を反射する必要がありました...

于 2010-04-08T14:33:06.253 に答える