У меня есть несколько служб 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 Ошибка проверки: уже объявлен complexType '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 and Response) будут дублироваться в Foo.cs, а затем в Bar.cs, что приведет, очевидно, к ошибкам компилятора.
Итак, , что является обычным способом создания клиентского кода, использующего такие службы?
Ограничения:
- не может отправить клиенту сборку, содержащую общие типы (чтобы они могли использовать параметр svcutil.exe/r)
- не может использовать команду "Добавить ссылку на службу..." в Visual Studio - нужна командная строка svcutil (или другой инструмент командной строки).