svcutil, WSDL и сгенерированные интерфейсы не достаточны для реализации - PullRequest
3 голосов
/ 31 марта 2010

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

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

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

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

Спасибо.

EDIT:

Проблема в 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.

Ответы [ 2 ]

6 голосов
/ 01 апреля 2010

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

1 голос
/ 01 апреля 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]. Я не вижу там никаких проблем.

...