У меня есть несколько служб WCF, которые совместно используют некоторые контракты данных, и мне нужно сгенерировать код на стороне клиента с помощью svcutil.exe. Я столкнулся с ошибками, используя два наиболее очевидных способа сделать это, и мне нужна помощь.
Но сначала, вот услуги:
[ServiceContract( Namespace = "http://www.me.com/services/" )]
public interface IFooService {
[OperationContract]
Response RunFoo( Request request );
}
[ServiceContract( Namespace = "http://www.me.com/services/" )]
public interface IBarService {
[OperationContract]
Response RunBar( Request request );
}
Ответ и запрос определены в отдельной сборке:
[DataContract( Namespace = "http://www.me.com/shared/" )]
public class Request {
[DataMember]
public int Input { get; set; }
}
[DataContract( Namespace = "http://www.me.com/shared/" )]
public class Response {
[DataMember]
public int Result { get; set; }
}
Сервисы реализованы каким-то тривиальным способом, скомпилированы, опубликованы - давайте теперь перейдем на сторону клиента.
Включение обеих служб в командной строке svcutil, например:
svcutil /o:Client.cs http://hostname.com/FooService.svc http://hostname.com/BarService.svc
приведет к многочисленным сообщениям об ошибках о дублированных типах данных, начиная с
Ошибка: произошла ошибка проверки схемы, сгенерированной во время экспорта:
Источник:
Строка: 1 Колонка: 9087
Ошибка проверки: глобальный элемент 'http://schemas.microsoft.com/2003/10/Serialization/:anyType' уже объявлен.
и заканчивается
Ошибка: произошла ошибка проверки схемы, сгенерированной во время экспорта:
Источник:
Строка: 1 Колонка: 12817
Ошибка проверки: комплексный тип 'http://www.me.com/shared/:Response' уже объявлен.
Генерация файла на стороне клиента отдельно для каждой службы позволяет избежать этих ошибок:
svcutil /o:Foo.cs http://hostname.com/FooService.svc
svcutil /o:Bar.cs http://hostname.com/BarService.svc
Но тогда определения общих типов (таких как Request и Response) будут продублированы в Foo.cs, а затем в Bar.cs, что, очевидно, приведет к ошибкам компилятора.
Итак, каков обычный способ генерации кода на стороне клиента, потребляющего такие услуги ?
Ограничения:
- не может отправить сборку, содержащую общие типы, клиенту (чтобы они могли использовать параметр / r svcutil.exe)
- не может использовать команду «Добавить ссылку на службу ...» в Visual Studio - требуется командная строка svcutil (или другой инструмент командной строки).