Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Контракты служб часто необходимо создавать из существующих служб. В .NET Framework 4.5 и более поздних версий классы контрактов данных можно создавать автоматически из существующих служб с помощью инструмента contract-first. Для использования средства контрактного проектирования, файл определения схемы XML (XSD) должен быть загружен локально, так как средство не может импортировать удаленные контракты данных через HTTP.
Средство контракт-ориентированной разработки интегрировано в Visual Studio 2012 и используется в качестве задачи сборки. Файлы кода, созданные задачей сборки, создаются каждый раз при создании проекта, чтобы проект легко принял изменения в базовом контракте службы.
Типы схем, которые может импортировать средство contract-first, включают следующие:
<xsd:complexType>
<xsd:simpleType>
</xsd:simpleType>
</xsd:complexType>
Простые типы не будут создаваться, если они являются примитивами, такими как Int16 или String; сложные типы не будут создаваться, если они имеют тип Collection. Типы также не будут создаваться, если они являются частью другого xsd:complexType. Во всех этих случаях типы будут ссылаться на существующие типы в проекте.
Добавление контракта данных в проект
Прежде чем использовать средство для начала контракта, необходимо добавить контракт службы (XSD) в проект. Для целей этого обзора следующий контракт будет использоваться для демонстрации функций, основанных на контракте. Это определение службы представляет собой небольшое подмножество контракта службы, используемого API поиска Bing.
<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="ServiceSchema"
targetNamespace="http://tempuri.org/ServiceSchema.xsd"
elementFormDefault="qualified"
xmlns="http://tempuri.org/ServiceSchema.xsd"
xmlns:mstns="http://tempuri.org/ServiceSchema.xsd"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
<xs:complexType name="SearchRequest">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="1" name="Version" type="xs:string" default="2.2" />
<xs:element minOccurs="0" maxOccurs="1" name="Market" type="xs:string" />
<xs:element minOccurs="0" maxOccurs="1" name="UILanguage" type="xs:string" />
<xs:element minOccurs="1" maxOccurs="1" name="Query" type="xs:string" />
<xs:element minOccurs="1" maxOccurs="1" name="AppId" type="xs:string" />
<xs:element minOccurs="0" maxOccurs="1" name="Latitude" type="xs:double" />
<xs:element minOccurs="0" maxOccurs="1" name="Longitude" type="xs:double" />
<xs:element minOccurs="0" maxOccurs="1" name="Radius" type="xs:double" />
</xs:sequence>
</xs:complexType>
<xs:simpleType name="WebSearchOption">
<xs:restriction base="xs:string">
<xs:enumeration value="DisableHostCollapsing" />
<xs:enumeration value="DisableQueryAlterations" />
</xs:restriction>
</xs:simpleType>
</xs:schema>
Чтобы добавить приведенный выше контракт службы в проект, щелкните проект правой кнопкой мыши и нажмите кнопку "Добавить". Выберите определение схемы в области WCF диалогового окна "Шаблоны" и назовите новый файл SampleContract.xsd. Скопируйте и вставьте приведенный выше код в представление кода нового файла.
Настройка параметров контракта для первого контракта
Параметры контракт-приоритет можно настроить в меню "Свойства" проекта WCF. Чтобы включить разработку с контрактом, установите флажок "Включить XSD в качестве языка определения типов " на странице WCF окна свойств проекта.
Чтобы настроить дополнительные свойства, нажмите кнопку "Дополнительно".
Следующие дополнительные параметры можно настроить для создания кода из контрактов. Параметры можно настроить только для всех файлов проекта; Параметры не могут быть настроены для отдельных файлов в настоящее время.
Режим сериализатора: этот параметр определяет, какой сериализатор используется для чтения файлов контракта службы. При выборе сериализатора XML параметры типов коллекции и повторного использования отключены. Эти параметры применяются только к сериализатору контракта данных.
Повторное использование типов: этот параметр указывает, какие библиотеки используются для повторного использования типов. Этот параметр применяется только в том случае, если режим сериализатора установлен на сериализатор контракта данных.
Тип коллекции: этот параметр указывает полностью квалифицированный или определяемый сборкой тип, который будет использоваться для типа данных коллекции. Этот параметр применяется только в том случае, если режим сериализатора установлен на сериализатор контракта данных.
Тип словаря: этот параметр указывает полностью квалифицированный или сборочно-квалифицированный тип, который должен быть использован для типа данных словаря.
EnableDataBinding: этот параметр указывает, следует ли реализовать интерфейс для всех типов данных для реализации INotifyPropertyChanged привязки данных.
Исключенные типы:Этот параметр указывает список полностью квалифицированных или квалифицированных сборкой типов, которые следует исключить из сборок, на которые есть ссылки. Этот параметр применяется только в том случае, если режим сериализатора установлен на сериализатор контракта данных.
GenerateInternalTypes: этот параметр указывает, следует ли создавать классы, помеченные как внутренние. Этот параметр применяется только в том случае, если режим сериализатора установлен на сериализатор контракта данных.
GenerateSerializableTypes: этот параметр указывает, следует ли создавать классы с помощью атрибута SerializableAttribute . Этот параметр применяется только в том случае, если режим сериализатора установлен на сериализатор контракта данных.
ImportXMLTypes: этот параметр указывает, следует ли настроить сериализатор контракта данных для применения SerializableAttribute атрибута к классам без атрибута DataContractAttribute . Этот параметр применяется только в том случае, если режим сериализатора установлен на сериализатор контракта данных.
SupportFx35TypedDataSets: этот параметр указывает, следует ли предоставлять дополнительные функциональные возможности для типизированных наборов данных, созданных для .NET Framework 3.5. Если для режима сериализатора задано значение XML Serializer, TypedDataSetSchemaImporterExtensionFx35 расширение будет добавлено в средство импорта схемы XML, если это значение имеет значение True. Когда режим сериализатора установлен на сериализатор контракта данных, тип DateTimeOffset будет исключен из ссылок, если это значение установлено на False, чтобы DateTimeOffset всегда создавался для более старых версий платформы.
InputXsdFiles: этот параметр задает список входных файлов. Каждый файл должен содержать допустимую XML-схему.
Язык: этот параметр задает язык созданного кода контракта. Параметр должен быть распознан по CodeDomProvider.
NamespaceMappings: этот параметр задает сопоставления из пространств имен XSD с пространствами имен CLR. Каждое сопоставление должно использовать следующий формат:
"Schema Namespace, CLR Namespace"Сериализатор XML принимает только одно сопоставление в следующем формате:
"*, CLR Namespace"OutputDirectory: этот параметр указывает каталог, в котором будут создаваться файлы кода.
Параметры будут использоваться для создания типов контрактов службы из файлов контракта службы при создании проекта.
Использование контрактно-ориентированной разработки
После добавления контракта службы в проект и подтверждения параметров сборки создайте проект, нажав клавишу F6. Затем типы, определенные в контракте службы, будут доступны для использования в проекте.
Чтобы использовать типы, определенные в контракте службы, добавьте ссылку на ContractTypes в текущее пространство имен.
using MyProjectNamespace.ContractTypes;
Затем типы, определенные в контракте службы, становятся доступными в проекте, как показано ниже:
Типы, созданные средством, создаются в файле GeneratedXSDTypes.cs. По умолчанию файл создается в каталоге проекта</>obj/<конфигурация сборки>/XSDGeneratedCode/. Пример схемы в начале этой статьи преобразуется следующим образом:
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.17330
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace TestXSD3.ContractTypes
{
using System.Xml.Serialization;
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.17330")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://tempuri.org/ServiceSchema.xsd")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://tempuri.org/ServiceSchema.xsd", IsNullable=true)]
public partial class SearchRequest
{
private string versionField;
private string marketField;
private string uILanguageField;
private string queryField;
private string appIdField;
private double latitudeField;
private bool latitudeFieldSpecified;
private double longitudeField;
private bool longitudeFieldSpecified;
private double radiusField;
private bool radiusFieldSpecified;
public SearchRequest()
{
this.versionField = "2.2";
}
/// <remarks/>
[System.ComponentModel.DefaultValueAttribute("2.2")]
public string Version
{
get
{
return this.versionField;
}
set
{
this.versionField = value;
}
}
/// <remarks/>
public string Market
{
get
{
return this.marketField;
}
set
{
this.marketField = value;
}
}
/// <remarks/>
public string UILanguage
{
get
{
return this.uILanguageField;
}
set
{
this.uILanguageField = value;
}
}
/// <remarks/>
public string Query
{
get
{
return this.queryField;
}
set
{
this.queryField = value;
}
}
/// <remarks/>
public string AppId
{
get
{
return this.appIdField;
}
set
{
this.appIdField = value;
}
}
/// <remarks/>
public double Latitude
{
get
{
return this.latitudeField;
}
set
{
this.latitudeField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlIgnoreAttribute()]
public bool LatitudeSpecified
{
get
{
return this.latitudeFieldSpecified;
}
set
{
this.latitudeFieldSpecified = value;
}
}
/// <remarks/>
public double Longitude
{
get
{
return this.longitudeField;
}
set
{
this.longitudeField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlIgnoreAttribute()]
public bool LongitudeSpecified
{
get
{
return this.longitudeFieldSpecified;
}
set
{
this.longitudeFieldSpecified = value;
}
}
/// <remarks/>
public double Radius
{
get
{
return this.radiusField;
}
set
{
this.radiusField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlIgnoreAttribute()]
public bool RadiusSpecified
{
get
{
return this.radiusFieldSpecified;
}
set
{
this.radiusFieldSpecified = value;
}
}
}
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.17330")]
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://tempuri.org/ServiceSchema.xsd")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://tempuri.org/ServiceSchema.xsd", IsNullable=false)]
public enum WebSearchOption
{
/// <remarks/>
DisableHostCollapsing,
/// <remarks/>
DisableQueryAlterations,
}
}
Ошибки и предупреждения
Ошибки и предупреждения, возникающие при анализе схемы XSD, будут отображаться как ошибки сборки и предупреждения.
Наследование интерфейса
Невозможно использовать наследование интерфейсов с разработкой на основе контракта; это соответствует способу поведения интерфейсов в других операциях. Чтобы использовать интерфейс, наследующий базовый интерфейс, используйте две отдельные конечные точки. Первая конечная точка использует унаследованный контракт, а вторая конечная точка реализует базовый интерфейс.