WCF Custom WSDL XmlSerializerOperationBehavior - PullRequest
0 голосов
/ 01 апреля 2010

У меня есть код, который на лету создает пользовательский wsdl WCF. В одном конкретном сценарии экспортируемый WSDL должен использовать XmlSerializerOperationBehavior в качестве IWsdlExportExtension, а не DataContractSerializerOperationBehavior IWsdlExportExtension по умолчанию.

Однако каждый раз, когда я пытаюсь сделать это из кода генерации WSDL, я получаю исключение нулевой ссылки из метода ExportBody XmlSerializerMessageContractExporter (который используется внутренне в System.ServiceModel методом XmlSerializerOperationBehavior ExportContract). Я отразил это и не вижу ничего заведомо неправильного. По какой-то причине .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

У кого-нибудь есть идеи по этому поводу?

Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 08 апреля 2010

Я понял это. Проблема в том, что XmlSerializerOperationBehavior вызовет исключение нулевой ссылки, если XmlSerializerFormatAttribute отсутствует в самом интерфейсе ServiceContract. Пришлось отражать все это, чтобы понять это ...

0 голосов
/ 02 апреля 2010

Вы проверили c, не нуль?

Единственное, о чем я могу думать, это утверждение

new WsdlExporter().ExportContract(c);

возможно, компилятору это не понравится, попробуйте вместо этого

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

В прошлом у нас были сценарии с операциями wcf и цепочками, и решением было освободить вызовы.

...