Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Модель контракта данных Windows Communication Foundation (WCF) поддерживает определенные типы, представляющие XML напрямую. При сериализации этих типов в XML сериализатор записывает содержимое XML этих типов без дополнительной обработки. Поддерживаемые типы XmlElement, массивы XmlNode (но не сам тип XmlNode), а также типы, реализующие IXmlSerializable. Типы DataSet и DataTable, а также типизированные наборы данных, часто используются в программировании баз данных. Эти типы реализуют IXmlSerializable интерфейс и поэтому сериализуются в модели контракта данных. Некоторые особые аспекты для этих типов перечислены в конце этого раздела.
Типы XML
Xml-элемент
Тип XmlElement сериализуется с помощью xml-содержимого. Например, используя следующий тип.
[DataContract(Namespace=@"http://schemas.contoso.com")]
public class MyDataContract
{
[DataMember]
public XmlElement myDataMember;
public void TestClass()
{
XmlDocument xd = new XmlDocument();
myDataMember = xd.CreateElement("myElement");
myDataMember.InnerText = "myContents";
myDataMember.SetAttribute
("myAttribute","myValue");
}
}
<DataContract([Namespace]:="http://schemas.contoso.com")> _
Public Class MyDataContract
<DataMember()> _
Public myDataMember As XmlElement
Public Sub TestClass()
Dim xd As New XmlDocument()
myDataMember = xd.CreateElement("myElement")
myDataMember.InnerText = "myContents"
myDataMember.SetAttribute("myAttribute", "myValue")
End Sub
End Class
Сериализуется в XML следующим образом:
<MyDataContract xmlns="http://schemas.contoso.com">
<myDataMember>
<myElement xmlns="" myAttribute="myValue">
myContents
</myElement>
</myDataMember>
</MyDataContract>
Обратите внимание, что элемент-член <myDataMember> данных-оболочки по-прежнему присутствует. Нет способа удаления этого элемента в модели контракта данных. Сериализаторы, обрабатывающие эту модель ( DataContractSerializer и NetDataContractSerializer) могут выдавать специальные атрибуты в этот элемент оболочки. К этим атрибутам относятся стандартный атрибут экземпляра схемы XML "nil" (позволяющий XmlElement быть null) и атрибут "type" (позволяющий XmlElement использовать полиморфно). Кроме того, следующие атрибуты XML относятся к WCF: "Id", "Ref", "Type" и "Assembly". Эти атрибуты могут быть сгенерированы для поддержки использования XmlElement при включенном режиме сохранения графа объектов или NetDataContractSerializer. (Дополнительные сведения о режиме сохранения графа объектов см. в разделе Сериализация и десериализация.)
Массивы или коллекции XmlElement разрешены и обрабатываются как любой другой массив или коллекция. То есть для всей коллекции существует элемент-оболочка и отдельный элемент оболочки (аналогично <myDataMember> предыдущему примеру) для каждого XmlElement из массивов.
При десериализации объект XmlElement создаётся десериализатором из входящего XML. Допустимый родительский объект XmlDocument предоставляется десериализатором.
Убедитесь, что XML-фрагмент, который десериализуется в XmlElement, определяет все используемые префиксы и не полагается на определения префиксов из родительских элементов. Эта проблема возникает только при использовании DataContractSerializer для доступа к XML из другого (не-DataContractSerializer) источника.
При использовании DataContractSerializer с XmlElement его можно полиморфно назначить, но только элементу данных типа Object. Несмотря на то что он реализует IEnumerable, XmlElement нельзя использовать в качестве типа коллекции и не может быть назначен элементу IEnumerable данных. Как и во всех полиморфных назначениях, элемент DataContractSerializer излучает имя контракта данных в результирующем XML. В этом случае это "XmlElement" в http://schemas.datacontract.org/2004/07/System.Xml пространстве имен.
С помощью NetDataContractSerializer поддерживается любое допустимое полиморфное назначение XmlElement в Object или IEnumerable.
Не пытайтесь использовать ни один из сериализаторов с типами, производными от XmlElement, независимо от того, назначены ли они полиморфно или нет.
Массив XmlNode
Использование массивов XmlNode очень похоже на использование XmlElement. Использование массивов XmlNode обеспечивает большую гибкость, чем использование XmlElement. Можно написать несколько элементов в элементе упаковки элементов данных. Вы также можете внедрить содержимое, отличное от элементов внутри элемента упаковки элементов данных, таких как XML-комментарии. Наконец, можно поместить атрибуты в элемент данных-оболочки. Все это можно достичь, заполнив массив XmlNode конкретными производными классами, такими как XmlNode, XmlAttribute или XmlElement. Например, используя следующий тип.
[DataContract(Namespace="http://schemas.contoso.com")]
public class MyDataContract
{
[DataMember]
public XmlNode[] myDataMember = new XmlNode[4];
public void TestClass()
{
XmlDocument xd = new XmlDocument();
XmlElement xe = xd.CreateElement("myElement");
xe.InnerText = "myContents";
xe.SetAttribute
("myAttribute","myValue");
XmlAttribute atr = xe.Attributes[0];
XmlComment cmnt = xd.CreateComment("myComment");
myDataMember[0] = atr;
myDataMember[1] = cmnt;
myDataMember[2] = xe;
myDataMember[3] = xe;
}
}
<DataContract([Namespace]:="http://schemas.contoso.com")> _
Public Class MyDataContract
<DataMember()> _
Public myDataMember(3) As XmlNode
Public Sub TestClass()
Dim xd As New XmlDocument()
Dim xe As XmlElement = xd.CreateElement("myElement")
xe.InnerText = "myContents"
xe.SetAttribute("myAttribute", "myValue")
Dim atr As XmlAttribute = xe.Attributes(0)
Dim cmnt As XmlComment = xd.CreateComment("myComment")
myDataMember(0) = atr
myDataMember(1) = cmnt
myDataMember(2) = xe
myDataMember(3) = xe
End Sub
End Class
При сериализации результирующий XML-код аналогичен следующему коду.
<MyDataContract xmlns="http://schemas.contoso.com">
<myDataMember myAttribute="myValue">
<!--myComment-->
<myElement xmlns="" myAttribute="myValue">
myContents
</myElement>
<myElement xmlns="" myAttribute="myValue">
myContents
</myElement>
</myDataMember>
</MyDataContract>
Обратите внимание, что элемент <myDataMember> оболочки элемента данных содержит атрибут, комментарий и два элемента. Это четыре XmlNode экземпляра, которые были сериализованы.
Массив XmlNode , который приводит к недопустимому XML-файлу, не может быть сериализован. Например, массив из двух экземпляров XmlNode, где первый является XmlElement, а второй — XmlAttribute, является недопустимым, поскольку эта последовательность не соответствует ни одной допустимой XML структуре (некуда присоединить атрибут).
При десериализации массива XmlNode узлов создаются и заполняются сведениями из входящего XML. Допустимый родительский объект XmlDocument предоставляется десериализатором. Все узлы десериализуются, включая любые атрибуты элемента-оболочки члена данных, но исключая атрибуты, помещенные сериализаторами WCF (например, атрибуты, используемые для указания полиморфного назначения). Предостережение о определении всех префиксов пространства имен в фрагменте XML применяется к десериализации массивов XmlNode так же, как и к десериализации XmlElement.
При использовании сериализаторов с включенным сохранением графа объектов равенство объектов сохраняется только на уровне XmlNode массивов, а не отдельных XmlNode экземпляров.
Не пытайтесь сериализовать массив XmlNode, если один или несколько узлов установлены в null. Разрешено для всего элемента массива null, но не для любого отдельного элемента XmlNode, содержащегося в массиве. Если весь элемент массива имеет значение NULL, элемент-член данных-оболочки содержит специальный атрибут, указывающий, что он имеет значение NULL. При десериализации весь элемент массива также становится null.
Только обычные массивы XmlNode обрабатываются специально сериализатором. Элементы данных, объявленные как другие типы коллекций, содержащие XmlNodeили члены данных, объявленные как массивы типов, производных от XmlNode, не обрабатываются специально. Таким образом, они обычно не сериализуются, если они не соответствуют одному из других критериев сериализации.
Разрешены массивы или коллекции массивов XmlNode . Существует элемент-оболочка для всей коллекции и отдельный элемент оболочки (аналогично <myDataMember> предыдущему примеру) для каждого массива XmlNode во внешнем массиве или коллекции.
Заполнение элемента данных типа Array или Object из Array или IEnumerable экземплярами XmlNode не приводит к тому, что элемент данных обрабатывается как Array из экземпляров XmlNode. Каждый элемент массива сериализуется отдельно.
При использовании с DataContractSerializer массивами XmlNode их можно полиморфно назначать, но только элементу данных типа Object. Несмотря на то, что он реализует IEnumerable, массив XmlNode не может использоваться в качестве типа коллекции и быть назначен элементу IEnumerable данных. Как и во всех полиморфных назначениях, DataContractSerializer выдает имя контракта данных в результирующем XML; в этом случае оно "ArrayOfXmlNode" в пространстве имен http://schemas.datacontract.org/2004/07/System.Xml. При использовании с NetDataContractSerializer, поддерживается любое допустимое назначение массива XmlNode.
Соображения по схеме
Дополнительные сведения о сопоставлении схем типов XML см. в справочнике по схеме контракта данных. В этом разделе представлена сводка важных моментов.
Элемент данных типа XmlElement сопоставляется с элементом, определенным с помощью следующего анонимного типа.
<xsd:complexType>
<xsd:sequence>
<xsd:any minOccurs="0" processContents="lax" />
</xsd:sequence>
</xsd:complexType>
Элемент данных массива XmlNode типов сопоставляется с элементом, определенным с помощью следующего анонимного типа.
<xsd:complexType mixed="true">
<xsd:sequence>
<xsd:any minOccurs="0" maxOccurs="unbounded" processContents="lax" />
</xsd:sequence>
<xsd:anyAttribute/>
</xsd:complexType>
Типы, реализующие интерфейс IXmlSerializable
Типы, которые реализуют интерфейс IXmlSerializable, полностью поддерживаются DataContractSerializer. Атрибут XmlSchemaProviderAttribute всегда должен применяться к этим типам для управления схемой.
Существует три разновидности типов, реализующих IXmlSerializable: типы, представляющие произвольное содержимое, типы, представляющие один элемент и устаревшие DataSet типы.
Типы контента используют метод поставщика схем, указанный атрибутом
XmlSchemaProviderAttribute. Метод не возвращаетnull, а свойство IsAny атрибута остается по умолчанию значениемfalse. Это наиболее распространенное использованиеIXmlSerializableтипов.Типы элементов используются, когда
IXmlSerializableтип должен управлять собственным корневым именем элемента. Чтобы указать тип как тип элемента, задайте свойство IsAny атрибута XmlSchemaProviderAttribute вtrue, или же верните null из метода поставщика схемы. Может быть необязательным использование метода поставщика схемы для типов элементов — вместо имени метода в элементеXmlSchemaProviderAttributeможно указать значение NULL. Однако, еслиIsAnyявляетсяtrueи указан метод провайдера схемы, метод должен возвращать значение null.Устаревшие DataSet типы — это
IXmlSerializableтипы, которые не помечены атрибутомXmlSchemaProviderAttribute. Вместо этого они полагаются на GetSchema метод для создания схемы. Этот шаблон используется дляDataSetтипа, и в более ранних версиях .NET Framework его типизированный набор данных производит класс, но теперь он устарел и поддерживается только по причинам наследия. Не полагайтесь на этот шаблон и всегда применяйтеXmlSchemaProviderAttributeк типамIXmlSerializable.
Типы контента IXmlSerializable
При сериализации элемента данных типа, реализующего IXmlSerializable и являющегося типом контента, как определено ранее, сериализатор записывает элемент оболочки для элемента данных и передает элемент управления методу WriteXml . Реализация WriteXml может записывать любой XML-код, включая добавление атрибутов в элемент оболочки. После завершения WriteXml сериализатор закрывает элемент.
При десериализации элемента данных типа, реализующего IXmlSerializable и являющегося типом контента, как определено ранее, десериализатор помещает средство чтения XML на элемент оболочки для элемента данных и передает элемент управления методу ReadXml . Метод должен считывать весь элемент, включая начальные и конечные теги. Убедитесь, что ReadXml код обрабатывает случай, когда элемент пуст. Кроме того, реализация ReadXml не должна полагаться на элемент оболочки, который называется определенным способом. Имя, выбранное сериализатором, может отличаться.
Можно назначать IXmlSerializable типы контента полиморфно, например членам данных типа Object. Кроме того, для экземпляров типов допускается значение NULL. Наконец, можно использовать типы IXmlSerializable с включенным сохранением графа объектов и с использованием NetDataContractSerializer. Все эти функции требуют, чтобы сериализатор WCF присоединял определенные атрибуты к элементу-оболочке ('nil' и 'type' в пространстве имен экземпляра схемы XML и 'Id', 'Ref', 'Type' и 'Assembly' в пространстве имен, специфичном для WCF).
Атрибуты, которые следует игнорировать при реализации ReadXml
Перед передачей элемента управления в ReadXml код десериализатор проверяет XML-элемент, обнаруживает эти специальные XML-атрибуты и выполняет соответствующие действия. Например, если "nil" имеет значение true, десериализуется null, и ReadXml не вызывается. Если обнаружен полиморфизм, содержимое элемента десериализировано, как будто это был другой тип. Вызывается полиморфная реализация ReadXml типа. В любом случае, реализация ReadXml должна игнорировать эти специальные атрибуты, поскольку они обрабатываются десериализатором.
Рекомендации по схеме для типов контента IXmlSerializable
При экспорте схемы типа контента IXmlSerializable вызывается метод поставщика схем.
XmlSchemaSet передается методу поставщика схем. Метод может добавить любую допустимую схему в набор схем. Набор схем содержит схему, которая уже известна во время экспорта схемы. Если метод поставщика схем должен добавить элемент в набор схем, он должен определить, существует ли в наборе XmlSchema с соответствующим пространством имен. Если это так, метод поставщика схем должен добавить новый элемент в существующий XmlSchema. В противном случае он должен создать новый XmlSchema экземпляр. Это важно, если используются массивы IXmlSerializable типов. Например, если у вас есть тип IXmlSerializable, экспортируемый как тип "A" в пространстве имен "B", то возможно, что к моменту вызова метода поставщика схем уже существует набор схем, который содержит схему для "B" для хранения типа ArrayOfA.
В дополнение к добавлению типов в XmlSchemaSet, метод схемы поставщика для типов контента должен возвращать ненулевое значение. Он может возвращать XmlQualifiedName, указывающий имя типа схемы для использования данного типа IXmlSerializable. Это квалифицированное имя также служит именем контракта данных и пространством имен для данного типа. Разрешается возвращать тип, который не существует в наборе схем сразу после возврата метода поставщика схемы. Однако ожидается, что к тому времени, когда экспортируются все связанные типы (метод Export вызывается для всех соответствующих типов и осуществляется обращение к свойству XsdDataContractExporterSchemas), тип существует в наборе схем. Если получить доступ к свойству Schemas до того, как будут сделаны все соответствующие вызовы Export, это может привести к XmlSchemaException. Дополнительные сведения о процессе экспорта см. в разделе "Экспорт схем из классов".
Метод поставщика схемы также может возвращать XmlSchemaType для использования. Тип может быть анонимным или неанонимным. Если тип является анонимным, схема для IXmlSerializable типа экспортируется как анонимный тип каждый раз, когда тип IXmlSerializable используется в качестве члена данных. Тип IXmlSerializable по-прежнему имеет имя контракта данных и пространство имен. (Это определяется как описано в именах контрактов данных , за исключением того, что DataContractAttribute атрибут не может использоваться для настройки имени.) Если он не является анонимным, он должен быть одним из типов в объекте XmlSchemaSet. Этот случай эквивалентен возврату XmlQualifiedName типа.
Кроме того, для типа экспортируется глобальное объявление элемента. Если к типу не применяется атрибут XmlRootAttribute, элемент имеет то же имя и пространство имен, что и контракт данных, и его свойство "nillable" равно true. Единственным исключением является пространство имен схемы (http://www.w3.org/2001/XMLSchema). Если контракт данных типа находится в этом пространстве имен, соответствующий глобальный элемент находится в пустом пространстве имен, поскольку запрещено добавлять новые элементы в пространство имен схемы. Если к типу XmlRootAttribute применен атрибут, глобальное объявление элемента экспортируется с помощью следующих свойств: ElementName, Namespaceи IsNullable. По умолчанию применяются XmlRootAttribute имя контракта данных, пустое пространство имен и значение "nillable" равно true.
Те же правила объявления глобальных элементов применяются к устаревшим типам наборов данных. Обратите внимание, что XmlRootAttribute не может переопределять объявления глобальных элементов, добавленные через пользовательский код, будь то добавленные в XmlSchemaSet с помощью метода поставщика схем или через GetSchema для устаревших типов наборов данных.
Типы элементов IXmlSerializable
IXmlSerializable Типы элементов имеют либо свойство IsAny, установленное в true, либо их метод поставщика схем возвращает null.
Сериализация и десериализация типа элемента очень похожа на сериализацию и десериализацию типа контента. Однако существуют некоторые важные различия:
Ожидается, что реализация
WriteXmlбудет записывать ровно один элемент, который, конечно, может содержать несколько дочерних элементов. Не следует писать атрибуты за пределами этого одного элемента, нескольких одноуровневых элементов или смешанного содержимого. Элемент может быть пустым.Реализация
ReadXmlне должна считывать элемент оболочки. Ожидается, что он считывает один элемент, которыйWriteXmlсоздает.При регулярной сериализации типа элемента (например, в качестве члена данных в контракте данных) сериализатор выводит элемент оболочки перед вызовом
WriteXml, так же, как и для типов содержимого. Однако при сериализации типа элемента на верхнем уровне сериализатор обычно не выводит элемент-оболочку вокруг элемента, который записываетсяWriteXml, если только корневое имя и пространство имен не были явно указаны при создании сериализатора в конструкторахDataContractSerializerилиNetDataContractSerializer. Дополнительные сведения см. в разделе Сериализация и десериализация.При сериализации типа элемента на верхнем уровне без указания корневого имени и пространства имен во время построения, WriteStartObject и WriteEndObject по сути ничего не делают, а WriteObjectContent вызывает
WriteXml. В этом режиме сериализованный объект не может иметь значение NULL и не может быть полиморфно назначен. Кроме того, сохранение графа объектов не может быть включено иNetDataContractSerializerне может использоваться.При десериализации элемента на верхнем уровне без указания корневого имени и пространства имен во время построения IsStartObject возвращает
true, если может найти начало любого элемента. ReadObject с параметромverifyObjectNameустановленнымtrueведет себя таким же образом, какIsStartObject, перед фактическим чтением объекта.ReadObjectзатем передает управление методуReadXml.
Схема, экспортируемая для типов элементов, такая же, как для типа XmlElement, как описано в предыдущем разделе, за исключением того, что метод поставщика схем может добавить любую дополнительную схему в XmlSchemaSet, как и для типов контента. Использование атрибута XmlRootAttribute с типами элементов не допускается, а глобальные объявления элементов никогда не создаются для этих типов.
Различия от XmlSerializer
Интерфейс IXmlSerializable и атрибуты XmlSchemaProviderAttribute и XmlRootAttribute также распознаются системой XmlSerializer. Однако существуют некоторые различия в том, как они обрабатываются в модели контракта данных. Важные различия приведены в следующих статьях:
Метод поставщика схем должен быть общедоступным для использования в
XmlSerializer, но не обязательно быть общедоступным для использования в модели контракта данных.Метод поставщика схемы вызывается, когда
IsAnyимеет значение true в модели контракта данных, но не когдаXmlSerializerимеет значение true.Если атрибут
XmlRootAttributeне присутствует для типов содержимого или устаревших наборов данных,XmlSerializerэкспортирует глобальное объявление элемента в пустом пространстве имен. В модели контракта данных обычно используется пространство имен контракта данных, как описано ранее.
Учитывайте эти различия при создании типов, используемых с обеими технологиями сериализации.
Импорт схемы IXmlSerializable
При импорте схемы, созданной из IXmlSerializable типов, существует несколько возможностей:
Созданная схема может быть допустимой схемой контракта данных, как описано в справочнике по схеме контракта данных. В этом случае схема может быть импортирована как обычно, и генерируются стандартные типы контрактов данных.
Созданная схема может не быть допустимой схемой контракта данных. Например, метод поставщика схем может создать схему, которая включает атрибуты XML, которые не поддерживаются в модели контракта данных. В этом случае схему данных можно импортировать как
IXmlSerializableтипы. Этот режим импорта не включен по умолчанию, но его можно легко включить. Например, при/importXmlTypesпереключении командной строки на средство служебной программы метаданных ServiceModel (Svcutil.exe). Это подробно описано в Импорт схемы для генерации классов. Обратите внимание, что вы должны работать непосредственно с XML для объектов типов. Вы также можете использовать другую технологию сериализации, которая поддерживает более широкий диапазон схем. См. раздел об использованииXmlSerializer.Вместо создания новых типов может потребоваться повторно использовать существующие
IXmlSerializableтипы в прокси-сервере. В этом случае функция ссылочных типов, описанная в разделе импорта схемы для создания типов, может использоваться для указания типа для повторного использования. Это соответствует использованию переключателя/referenceна svcutil.exe, указывающего сборку, содержащую типы для повторного использования.
Представление произвольного XML-кода в контрактах данных
Типы XmlElement, Массив XmlNode и IXmlSerializable позволяют внедрять произвольный XML-код в модель контракта данных.
DataContractSerializer и NetDataContractSerializer передают это XML-содержимое используемому XML-писателю, не вмешиваясь в процесс. Тем не менее авторы XML могут применять определенные ограничения на XML, который они пишут. В частности, ниже приведены некоторые важные примеры:
Создатели XML обычно не поддерживают объявление XML-документа (например, <?xml version='1.0'?>) во время написания другого документа. Вы не можете взять полный XML-документ и сериализовать его как
ArrayXmlNodeэлемент данных. Для этого необходимо либо удалить объявление документа, либо использовать собственную кодировочную схему, чтобы представить документ.Все записи XML, предоставленные WCF, отклоняют инструкции по обработке XML (<? ...> ) и определения типов документов (<! ... >), так как они не допускаются в сообщениях SOAP. Опять же, вы можете использовать собственный механизм кодирования для обхода этого ограничения. Если вы должны включить их в результирующий XML, можно написать пользовательский кодировщик, использующий XML-писатели, которые их поддерживают.
При реализации
WriteXmlизбегайте вызова метода WriteRaw на записывающем XML. WCF использует различные кодировки XML (включая двоичные), поэтому очень трудно или даже невозможно использоватьWriteRawтак, чтобы результат был пригоден для использования в любой кодировке.При реализации
WriteXmlизбегайте использования методов WriteEntityRef и WriteNmToken, так как они не поддерживаются на XML-писателях, предоставляемых WCF.
Использование набора данных, типизированного набора данных и Таблицы данных
Использование этих типов полностью поддерживается в модели контракта данных. При использовании этих типов следует учитывать следующие моменты:
Схема для этих типов (особенно DataSet и его типизированные производные классы) может не взаимодействовать с некоторыми платформами, отличными от WCF, или может привести к плохому использованию при использовании с этими платформами. Кроме того, использование
DataSetтипа может иметь последствия для производительности. Наконец, это может затруднить вам управлять версиями вашего приложения в будущем. Рекомендуется использовать явно определенные типы контрактов данных вместоDataSetтипов в контрактах.При импорте
DataSetилиDataTableсхем важно ссылаться на эти типы. С помощью средства командной строки Svcutil.exe это можно сделать, передав имя сборки System.Data.dll в опцию/reference. При импорте схемы типизированного набора данных необходимо ссылаться на типизированный тип набора данных. При Svcutil.exeпередайте расположение сборки типизированного набора данных коммутатору/reference. Дополнительные сведения о типах ссылок см. в статье "Импорт схемы для создания классов".
Поддержка типизированных наборов данных в модели контракта данных ограничена. Типизированные наборы данных можно сериализовать и десериализировать, а также экспортировать их схему. Однако импорт схемы контракта данных не может создавать новые типизированные типы Наборов данных из схемы, так как он может повторно использовать существующие. Вы можете указать существующий типизированный набор данных с помощью /r переключателя на Svcutil.exe. Если вы пытаетесь использовать Svcutil.exe без /r переключателя в службе, используюющей типизированный набор данных, автоматически выбирается альтернативный сериализатор (XmlSerializer). Если вы должны использовать DataContractSerializer и должны создавать наборы данных из схемы, можно использовать следующую процедуру: создайте типизированные типы наборов данных (с помощью средства Xsd.exe с /d переключателем службы), скомпилируйте типы, а затем укажите их с помощью /r переключателя на Svcutil.exe.