Ошибки/предупреждения при использовании svcutil.exe для создания прокси-классов для нескольких служб WCF

Я пишу приложение .NET 3.5 и контролирую как службу WCF, так и клиент.

Я использую svcutil для создания прокси-классов для своих служб, объединяя несколько служб, поскольку они имеют общие типы данных.

svcutil /out:ServiceReference.cs /noconfig /namespace:*,Global.ServiceReference 
 /tcv:Version35 http://localhost:12345/first.svc http://localhost:12345/second.svc

Более серьезной проблемой является ошибка: у меня дважды создается класс, что приводит к множеству ошибок «Неоднозначность между «Global.ServiceReference.MyClass.MyField» и «Global.ServiceReference.MyClass.MyField». Обратите внимание, что прямо сейчас на этот класс ссылаются только в ОДНОЙ из служб, хотя в будущем на него будут ссылаться другие.

Два сгенерированных класса выглядят так:

[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")]
[System.Runtime.Serialization.DataContractAttribute(Name="MyClass", Namespace="http://schemas.datacontract.org/2004/07/MyService.Util")]
public partial class MyClass : object, System.Runtime.Serialization.IExtensibleDataObject
{ 
  //fields
}

и

[System.CodeDom.Compiler.GeneratedCodeAttribute("svcutil", "3.0.4506.2152")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://schemas.datacontract.org/2004/07/MyService.Util")]
public partial class MyClass
{
  // same fields
}

Основываясь на применяемых к ним атрибутах, это как-то связано с DataContractSerializer и XmlSerializer, но я не совсем понимаю, что это значит.

Вторая проблема заключается в том, что svcutil выдает кучу предупреждений в форме:

Error: There was a validation error on a schema generated during export:
    Source:
    Line: 1 Column: 10415
   Validation Error: The simpleType 'http://schemas.microsoft.com/2003/10/Serialization/:guid' has already been declared.

Эти ошибки случаются даже с двумя очень простыми сервисами. Например, если сервис №1 имеет

[OperationContract]
public string test(int test)
{
    return "test";
}

и услуга № 2 имеет

[OperationContract]
public int Ping(string test)
{
    return 23;
}

... Я получаю предупреждения. Их около 100, и все они жалуются на различные globalElements, globalAttributes или simpleTypes, такие как guid, duration, char и т. д.

Если я изменю одну из служб, чтобы иметь только пустые параметры/тип возврата, я не получаю предупреждений. Это действительно сбивает с толку, так как это самый простой из возможных тестов. Без использования каких-либо пользовательских типов вообще svcutil блеет. Есть идеи, что здесь происходит?


person Clyde    schedule 17.11.2009    source источник


Ответы (2)


Что-то в файлах XSD заставляет svcutil вызывать XmlSerializer для создания некоторых ваших типов. К сожалению, совместное использование типов между DataContract и XmlSerializer недоступно, поэтому вы получаете дублированные типы. Поскольку похоже, что вы, вероятно, используете DC исключительно на сервере, может быть достаточно просто заставить svcutil оставаться в режиме DC и не переключаться на XmlSerializer, например:

svcutil /serializer:DataContractSerializer ...
person alexdej    schedule 20.11.2009

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

person rerun    schedule 18.11.2009
comment
Да, это создание классов. Я не знаю, что предупреждения причиняют мне боль, поэтому я буду рад их игнорировать, если они действительно не проблема. Это повторяющееся определение класса из первой части моего вопроса определенно убивает меня прямо сейчас. - person Clyde; 19.11.2009
comment
Я просто хочу добавить, что когда я делаю то же самое с svcutil.exe, я получаю ОШИБКИ - на самом деле это предупреждения, в том смысле, что выходной файл генерируется (и он работает!), но сообщение на экране говорит об ошибке: ....! Суперзапутанно! - person azheglov; 27.01.2010