svcutil, WSDL и сгенерированные интерфейсы недостаточны для реализации

У меня есть файл WSDL, определяющий службу, которую я должен реализовать в WCF. Я читал, что могу сгенерировать прокси, используя svcutil из файла WSDL, и что затем я могу использовать сгенерированные интерфейсы для реализации службы.

К сожалению, я не могу найти способ, чтобы интерфейсы содержали правильные атрибуты для раскрытия контрактов.

Все операции имеют атрибут «OperationContractAttribute», но похоже, что для предоставления услуги мне требуется «OperationContract» для каждой из них. То же самое с «ServiceContractAttribute» и «ServiceContract», и я представляю себе DataContract, но я еще не зашел так далеко.

Я мог бы внести эти изменения вручную, но я бы предпочел технику, в которой можно было бы легко использовать существующий код или сгенерировать лучший код для моих целей. Есть ли способ сделать это?

Спасибо.

РЕДАКТИРОВАТЬ:

Проблема с Microsoft Connect

Используемая команда:

svcutil ObjectManagerService.wsdl /n:*,Sample  /o:ObjectManagerServiceProxy.cs /nologo

Пример кода:

public interface ObjectManagerSyncPortType
{

    // CODEGEN: Generating message contract since the operation createObject is neither RPC nor document wrapped.
    [System.ServiceModel.OperationContractAttribute(Action="http://www.sample.com/createObject", ReplyAction="*")]
    [System.ServiceModel.XmlSerializerFormatAttribute()]
    Sample.createObjectResponse1 createObject(Sample.createObjectRequest1 request);
    // ...
}

Насколько я могу судить / вижу, файл WSDL полностью самодостаточен и не требует дополнительных файлов XSD.


person David    schedule 31.03.2010    source источник
comment
Пожалуйста, покажите нам используемую вами командную строку. Также покажите образец сгенерированного кода.   -  person John Saunders    schedule 31.03.2010


Ответы (2)


Итак, оказывается, что ReplyAction="*" является виновником. Спасибо за помощь.

person David    schedule 01.04.2010
comment
@chtmd: не могли бы вы сообщить об этом в Connect на странице connect.microsoft.com/visualstudio? Когда вы закончите, отредактируйте этот ответ, включив ссылку на отчет об ошибке Connect, чтобы мы могли проголосовать за то, насколько важным, по нашему мнению, будет исправление. - person John Saunders; 02.04.2010
comment
Я создал проблему и добавил ссылку выше. - person David; 16.04.2010

На самом деле я не вижу проблем с сгенерированным кодом:

public interface ObjectManagerSyncPortType
{

    // CODEGEN: Generating message contract since the operation createObject is neither RPC nor document wrapped.
    [System.ServiceModel.OperationContractAttribute(Action="http://www.sample.com/createObject", ReplyAction="*")]
    [System.ServiceModel.XmlSerializerFormatAttribute()]
    Sample.createObjectResponse1 createObject(Sample.createObjectRequest1 request);

Это абсолютно правильный код - попробуйте! Я почти уверен, что это работает.

Все операции имеют атрибут «OperationContractAttribute», но похоже, что для предоставления услуги мне требуется «OperationContract» для каждой из них.

Использование [OperationContract] - это просто сокращенная запись (которая верна, действительна и может использоваться для любого атрибута .NET, на самом деле - здесь нет ничего особенного в атрибутах WCF) и на 100% эквивалентна [OperationContractAttribute]. Я не вижу здесь никаких проблем.

person marc_s    schedule 31.03.2010
comment
Кажется, что часть (Action = sample.com/createObject, ReplyAction = *) - это то, что все портит, но я действительно не понимаю, почему. Если я удалю это из интерфейса и оставлю только [OperationContractAttribute], операция будет отображаться в WSDL при посещении службы, в противном случае она не будет видна. - person David; 01.04.2010