Создание контрактов службDesigning Service Contracts

Этот раздел описывает, что такое контракты служб, как они определяются, какие операции доступны (также описаны последствия обмена сообщениями, на которых они основаны), какие типы данных используются; кроме того, он содержит ответы на другие вопросы, которые помогут при разработке операций, удовлетворяющих требованиям вашего сценария.This topic describes what service contracts are, how they are defined, what operations are available (and the implications for the underlying message exchanges), what data types are used, and other issues that help you design operations that satisfy the requirements of your scenario.

Создание контракта службыCreating a Service Contract

Службы предоставляют несколько операций.Services expose a number of operations. В приложениях Windows Communication Foundation (WCF) определите операции, создав метод и пометив его атрибутом OperationContractAttribute.In Windows Communication Foundation (WCF) applications, define the operations by creating a method and marking it with the OperationContractAttribute attribute. Затем, для создания контракта службы, необходимо сгруппировать операции либо объявив их в интерфейсе, отмеченном атрибутом ServiceContractAttribute, либо определив их в классе с таким же атрибутом.Then, to create a service contract, group together your operations, either by declaring them within an interface marked with the ServiceContractAttribute attribute, or by defining them in a class marked with the same attribute. (Базовый пример см. в разделе как определить контракт службы.)(For a basic example, see How to: Define a Service Contract.)

Все методы, не имеющие атрибута OperationContractAttribute, не являются операциями службы и не предоставляются службами WCF.Any methods that do not have a OperationContractAttribute attribute are not service operations and are not exposed by WCF services.

Этот раздел рассказывает о принятии решений по следующим вопросам при создании контракта службы:This topic describes the following decision points when designing a service contract:

  • использовать ли классы или интерфейсы;Whether to use classes or interfaces.

  • как задать типы данных, которыми нужно обмениваться;How to specify the data types you want to exchange.

  • какие типы шаблонов обмена можно использовать;The types of exchange patterns you can use.

  • можно ли сделать явные требования безопасности частью контракта;Whether you can make explicit security requirements part of the contract.

  • каковы ограничения для входных и выходных данных операций.The restrictions for operation inputs and outputs.

Классы или интерфейсыClasses or Interfaces

Классы и интерфейсы представляют собой группирование функциональных возможностей и, следовательно, могут использоваться для определения контракта службы WCF.Both classes and interfaces represent a grouping of functionality and, therefore, both can be used to define a WCF service contract. Однако рекомендуется использовать интерфейсы, так как они напрямую моделируют контракты служб.However, it is recommended that you use interfaces because they directly model service contracts. Не имея реализации, интерфейсы всего лишь определяют группу методов с определенными сигнатурами.Without an implementation, interfaces do no more than define a grouping of methods with certain signatures. Реализуйте интерфейс контракта службы, и вы реализовали службу WCF.Implement a service contract interface and you have implemented a WCF service.

Все преимущества управляемых интерфейсов относятся также к интерфейсам контрактов служб:All the benefits of managed interfaces apply to service contract interfaces:

  • интерфейсы контрактов служб могут расширять любое число других интерфейсов контрактов служб;Service contract interfaces can extend any number of other service contract interfaces.

  • отдельный класс может реализовывать любое число контрактов служб, реализуя интерфейсы этих контрактов служб;A single class can implement any number of service contracts by implementing those service contract interfaces.

  • можно изменить реализацию контракта службы, изменив реализацию интерфейса и не изменяя сам контракт;You can modify the implementation of a service contract by changing the interface implementation, while the service contract remains the same.

  • можно создать несколько версий службы, реализуя старый и новый интерфейсы.You can version your service by implementing the old interface and the new one. Старые клиенты могут подключаться к исходной версии, а более новые клиенты - к более новой версии.Old clients connect to the original version, while newer clients can connect to the newer version.

Примечание

При наследовании от других интерфейсов контрактов служб нельзя переопределять свойства операций, например имя или пространство имен.When inheriting from other service contract interfaces, you cannot override operation properties, such as the name or namespace. Если попытаться сделать это, будет создана новая операция в текущем контракте службы.If you attempt to do so, you create a new operation in the current service contract.

Пример использования интерфейса для создания контракта службы см. в разделе инструкции. Создание службы с интерфейсом контракта.For an example of using an interface to create a service contract, see How to: Create a Service with a Contract Interface.

Однако можно использовать класс для определения контракта службы и одновременной реализации этого контракта.You can, however, use a class to define a service contract and implement that contract at the same time. Преимущество создания службы путем применения атрибутов ServiceContractAttribute и OperationContractAttribute напрямую к классу и методам класса, соответственно, - это скорость и простота.The advantage of creating your services by applying ServiceContractAttribute and OperationContractAttribute directly to the class and the methods on the class, respectively, is speed and simplicity. Недостаток состоит в том, что управляемые классы не поддерживают множественное наследование, и в результате могут реализовывать только один контракт службы за раз.The disadvantages are that managed classes do not support multiple inheritance, and as a result they can only implement one service contract at a time. Кроме того, любое изменение сигнатуры класса или метода изменяет открытый контракт для этой службы, что может предотвратить использование службы неизмененными клиентами.In addition, any modification to the class or method signatures modifies the public contract for that service, which can prevent unmodified clients from using your service. Дополнительные сведения см. в разделе реализация контрактов служб.For more information, see Implementing Service Contracts.

Пример использования класса для создания контракта службы и его реализации в то же время см. в разделе как создать службу с помощью класса контракта.For an example that uses a class to create a service contract and implements it at the same time, see How to: Create a Service with a Contract Class.

К этому моменту у вас должно было сложиться представление о том, в чем заключается разница между определением контракта службы через интерфейс и через класс.At this point, you should understand the difference between defining your service contract by using an interface and by using a class. Следующий шаг - определить, какие данные могут передаваться между службой и клиентами.The next step is deciding what data can be passed back and forth between a service and its clients.

Параметры и возвращаемые значенияParameters and Return Values

Каждая операция имеет возвращаемое значение и параметр, даже в случае void.Each operation has a return value and a parameter, even if these are void. Однако, в отличие от локального метода, в котором можно передавать ссылки на объекты от одного объекта к другому, операции служб не передают ссылки на объекты.However, unlike a local method, in which you can pass references to objects from one object to another, service operations do not pass references to objects. Вместо этого они передают копии объектов.Instead, they pass copies of the objects.

Это важно, потому что каждый тип, используемый для параметра или возвращаемого значения, должен быть сериализуем. Это значит, должно быть возможно преобразование объекта этого типа в поток байтов и обратно из потока байтов в объект.This is significant because each type used in a parameter or return value must be serializable; that is, it must be possible to convert an object of that type into a stream of bytes and from a stream of bytes into an object.

Примитивные типы сериализуемы по умолчанию, как и многие типы в .NET Framework.Primitive types are serializable by default, as are many types in the .NET Framework.

Примечание

Значения имен параметров в сигнатуре операции являются частью контракта и чувствительны к регистру.The value of the parameter names in the operation signature are part of the contract and are case sensitive. Если требуется использовать одно имя параметра локально, но изменить имя опубликованных метаданных, см. раздел System.ServiceModel.MessageParameterAttribute.If you want to use the same parameter name locally but modify the name in the published metadata, see the System.ServiceModel.MessageParameterAttribute.

Контракты данныхData Contracts

Приложения, ориентированные на службы, такие как Windows Communication Foundation (WCF), предназначены для взаимодействия с самым широким количеством клиентских приложений на платформах Майкрософт и сторонних производителей.Service-oriented applications like Windows Communication Foundation (WCF) applications are designed to interoperate with the widest possible number of client applications on both Microsoft and non-Microsoft platforms. Для наиболее широких возможностей взаимодействия рекомендуется помечать типы атрибутами DataContractAttribute и DataMemberAttribute для создания контракта данных - части контракта службы, описывающей данные, которыми могут обмениваться операции службы.For the widest possible interoperability, it is recommended that you mark your types with the DataContractAttribute and DataMemberAttribute attributes to create a data contract, which is the portion of the service contract that describes the data that your service operations exchange.

Контракты данных - включаемые по требованию контракты стилей: тип или элемент данных не сериализуются, если не применен явным образом атрибут контракта данных.Data contracts are opt-in style contracts: No type or data member is serialized unless you explicitly apply the data contract attribute. Контракты данных не связаны с областью доступа управляемого кода: закрытые элементы данных могут быть сериализованы и отправлены куда-либо для открытого доступа.Data contracts are unrelated to the access scope of the managed code: Private data members can be serialized and sent elsewhere to be accessed publicly. (Простой пример контракта данных см. в разделе как создать базовый контракт данных для класса или структуры.) WCF обрабатывает определение базовых сообщений SOAP, которые обеспечивают функциональность операции, а также сериализацию типов данных в текст сообщений и из него.(For a basic example of a data contract, see How to: Create a Basic Data Contract for a Class or Structure.) WCF handles the definition of the underlying SOAP messages that enable the operation's functionality as well as the serialization of your data types into and out of the body of the messages. Если типы данных сериализуемы, нет необходимости думать об инфраструктуре обмена базовыми сообщениями при создании операций.As long as your data types are serializable, you do not need to think about the underlying message exchange infrastructure when designing your operations.

Хотя типичное приложение WCF использует атрибуты DataContractAttribute и DataMemberAttribute для создания контрактов данных для операций, можно использовать другие механизмы сериализации.Although the typical WCF application uses the DataContractAttribute and DataMemberAttribute attributes to create data contracts for operations, you can use other serialization mechanisms. Стандартные механизмы ISerializable, SerializableAttribute и IXmlSerializable все обеспечивают сериализацию типов данных в базовые сообщения SOAP, которые переносят данные от одного приложения к другому.The standard ISerializable, SerializableAttribute and IXmlSerializable mechanisms all work to handle the serialization of your data types into the underlying SOAP messages that carry them from one application to another. Можно применить дополнительные стратегии сериализации, если типы данных требуют специальной поддержки.You can employ more serialization strategies if your data types require special support. Дополнительные сведения о выборе сериализации типов данных в приложениях WCF см. в разделе указание передача данных в контрактах служб.For more information about the choices for serialization of data types in WCF applications, see Specifying Data Transfer in Service Contracts.

Сопоставление параметров и возвращаемых значений с обменом сообщениямиMapping Parameters and Return Values to Message Exchanges

Операции службы поддерживаются при помощи базового обмена сообщениями SOAP, в которых передаются данные приложения в двух направлениях, а также данные, необходимые приложению для поддержки стандартной безопасности, транзакций и возможностей, связанных с сеансами.Service operations are supported by an underlying exchange of SOAP messages that transfer application data back and forth, in addition to the data required by the application to support certain standard security, transaction, and session-related features. Так как это так, сигнатура операции службы определяет определенный шаблон обмена сообщениями (MEP), который поддерживает перенос данных и функции, необходимые для операции.Because this is the case, the signature of a service operation dictates a certain underlying message exchange pattern (MEP) that can support the data transfer and the features an operation requires. В модели программирования WCF можно указать три шаблона: запрос-ответ, односторонний и дуплексные шаблоны сообщений.You can specify three patterns in the WCF programming model: request/reply, one-way, and duplex message patterns.

Запрос-ответRequest/Reply

Шаблон запрос-ответ означает, что отправитель запроса (клиентское приложение) получает ответ, который соответствует запросу.A request/reply pattern is one in which a request sender (a client application) receives a reply with which the request is correlated. Это шаблон обмена сообщениями по умолчанию, так как он поддерживает операцию, в которую передается один или больше параметров и из которой происходит возврат результирующего значения вызывавшей стороне.This is the default MEP because it supports an operation in which one or more parameters are passed to the operation and a return value is passed back to the caller. Например, следующий пример кода на языке C# показывает основную операцию службы, которая получает и возвращает строку.For example, the following C# code example shows a basic service operation that takes one string and returns a string.

[OperationContractAttribute]  
string Hello(string greeting);  

Ниже приведен эквивалентный код Visual Basic.The following is the equivalent Visual Basic code.

<OperationContractAttribute()>  
Function Hello (ByVal greeting As String) As String  

Сигнатура этой операции диктует вид базового обмена сообщениями.This operation signature dictates the form of underlying message exchange. Если корреляция не существовала, WCF не может определить, для какой операции предназначено возвращаемое значение.If no correlation existed, WCF cannot determine for which operation the return value is intended.

Обратите внимание, что если не указать другой шаблон сообщения, даже операции службы, возвращающие void (Nothing в Visual Basic), будут обмениваться сообщениями запросов и ответов.Note that unless you specify a different underlying message pattern, even service operations that return void (Nothing in Visual Basic) are request/reply message exchanges. Результат для операции такой: если клиент не вызывает операцию асинхронно, клиент приостанавливает обработку до получения возвращаемого сообщения, даже несмотря на то, что в нормальном случае это сообщение пустое.The result for your operation is that unless a client invokes the operation asynchronously, the client stops processing until the return message is received, even though that message is empty in the normal case. Следующий пример кода на C# показывает операцию, которая не отвечает, пока клиент не получит пустое сообщение в ответ.The following C# code example shows an operation that does not return until the client has received an empty message in response.

[OperationContractAttribute]  
void Hello(string greeting);  

Ниже приведен эквивалентный код Visual Basic.The following is the equivalent Visual Basic code.

<OperationContractAttribute()>  
Sub Hello (ByVal greeting As String)  

Приведенный пример кода может понизить производительность и скорость ответа клиента, если выполнение операции требует длительного времени, но у операций типа запрос-ответ есть преимущества, даже если они возвращают void.The preceding example can slow client performance and responsiveness if the operation takes a long time to perform, but there are advantages to request/reply operations even when they return void. Наиболее очевидное состоит в том, что сообщения о неисправностях SOAP могут возвращаться в сообщении ответа, что будет указывать на возникновение какой-либо связанной со службой ошибки либо при подключении, либо при обработке.The most obvious one is that SOAP faults can be returned in the response message, which indicates that some service-related error condition has occurred, whether in communication or processing. Неисправности SOAP, заданные в контракте службы, передаются клиентскому приложению в виде объекта FaultException<TDetail>, где параметр типа - это тип, заданный в контракте службы.SOAP faults that are specified in a service contract are passed to the client application as a FaultException<TDetail> object, where the type parameter is the type specified in the service contract. Это позволяет легко уведомлять клиентов об условиях ошибок в службах WCF.This makes notifying clients about error conditions in WCF services easy. Дополнительные сведения об исключениях, ошибках SOAP и обработке ошибок см. в разделе Указание и обработка ошибок в контрактах и службах.For more information about exceptions, SOAP faults, and error handling, see Specifying and Handling Faults in Contracts and Services. Пример службы "запрос-ответ" и "клиент" см. в разделе как создать контракт с запросом и ответом.To see an example of a request/reply service and client, see How to: Create a Request-Reply Contract. Дополнительные сведения о проблемах с шаблоном "запрос-ответ" см. в разделе службы "запрос-ответ".For more information about issues with the request-reply pattern, see Request-Reply Services.

ОдностороннийOne-way

Если клиент приложения службы WCF не должен ждать завершения операции и не обрабатывает ошибки SOAP, операция может указать односторонний шаблон сообщения.If the client of a WCF service application should not wait for the operation to complete and does not process SOAP faults, the operation can specify a one-way message pattern. Односторонняя операция — это одна, в которой клиент вызывает операцию и продолжит обработку после того, как WCF запишет сообщение в сеть.A one-way operation is one in which a client invokes an operation and continues processing after WCF writes the message to the network. Обычно это означает, что клиент продолжает работу почти без перерыва, если объем данных, передаваемых в исходящем сообщение не очень велик, и если не возникает ошибка при передаче данных.Typically this means that unless the data being sent in the outbound message is extremely large the client continues running almost immediately (unless there is an error sending the data). Этот шаблон обмена сообщениями поддерживает событийное взаимодействие между клиентом и приложением службы.This type of message exchange pattern supports event-like behavior from a client to a service application.

Обмен сообщениями, при котором одно сообщение отправляется и ни одного не принимается не поддерживает операции службы, для которых задано возвращаемое значение, отличное от void; в таком случае возникает исключение InvalidOperationException.A message exchange in which one message is sent and none are received cannot support a service operation that specifies a return value other than void; in this case an InvalidOperationException exception is thrown.

Отсутствие обратного сообщения также означает, что не может быть возвращено сообщение о неисправностях SOAP, указывающее на ошибки при обработке или подключении.No return message also means that there can be no SOAP fault returned to indicate any errors in processing or communication. (Передача сведений об ошибках подключения для односторонних операций требует дуплексного шаблона обмена сообщениями.)(Communicating error information when operations are one-way operations requires a duplex message exchange pattern.)

Чтобы задать односторонний обмен сообщениями для операции, возвращающей void, присвойте свойству IsOneWay значение true, как в следующем примере кода C#.To specify a one-way message exchange for an operation that returns void, set the IsOneWay property to true, as in the following C# code example.

[OperationContractAttribute(IsOneWay=true)]  
void Hello(string greeting);  

Ниже приведен эквивалентный код Visual Basic.The following is the equivalent Visual Basic code.

<OperationContractAttribute(IsOneWay := True)>  
Sub Hello (ByVal greeting As String)  

Метод тот же, что и в предшествующем примере типа запрос-ответ, но значение IsOneWay свойства true означает, что несмотря на то, что метод тот же, операция службы не посылает ответное сообщение и клиенты продолжают работу немедленно после передачи исходящего сообщения на уровень канала.This method is identical to the preceding request/reply example, but setting the IsOneWay property to true means that although the method is identical, the service operation does not send a return message and clients return immediately once the outbound message has been handed to the channel layer. Пример см. в разделе как создать односторонний контракт.For an example, see How to: Create a One-Way Contract. Дополнительные сведения о одностороннем шаблоне см. в разделе односторонние службы.For more information about the one-way pattern, see One-Way Services.

ДуплексDuplex

Дуплексный шаблон характеризуется способностью и службы, и клиента отправлять сообщения друг другу, независимо от того, используется ли односторонний обмен сообщениями или запрос-ответ.A duplex pattern is characterized by the ability of both the service and the client to send messages to each other independently whether using one-way or request/reply messaging. Такая форма двустороннего общения полезна для служб, которым требуется напрямую обращаться к клиенту, или для асинхронного взаимодействия обеих сторон обмена сообщениями, в том числе для событийного поведения.This form of two-way communication is useful for services that must communicate directly to the client or for providing an asynchronous experience to either side of a message exchange, including event-like behavior.

Дуплексный шаблон несколько более сложен, чем односторонний шаблон и шаблон запрос-ответ, так как имеет дополнительный механизм для взаимодействия с клиентом.The duplex pattern is slightly more complex than the request/reply or one-way patterns because of the additional mechanism for communicating with the client.

Для создания дуплексного контракта необходимо также создать контракт обратного вызова и присвоить тип этого контракта обратного вызова свойству CallbackContract атрибута ServiceContractAttribute контракта службы.To design a duplex contract, you must also design a callback contract and assign the type of that callback contract to the CallbackContract property of the ServiceContractAttribute attribute that marks your service contract.

Для реализации дуплексного шаблона необходимо создать второй интерфейс, содержащий объявления методов, вызываемых на клиенте.To implement a duplex pattern, you must create a second interface that contains the method declarations that are called on the client.

Пример создания службы и клиента, обращающегося к этой службе, см. в разделе как создать дуплексный контракт и как получить доступ к службам с помощью дуплексного контракта.For an example of creating a service, and a client that accesses that service, see How to: Create a Duplex Contract and How to: Access Services with a Duplex Contract. Рабочий пример см. в разделе дуплекс.For a working sample, see Duplex. Дополнительные сведения о проблемах с дуплексными контрактами см. в разделе Дуплексные службы.For more information about issues using duplex contracts, see Duplex Services.

Внимание!

Когда служба получает дуплексное сообщение, она проверяет элемент ReplyTo входящего сообщения, чтобы определить, куда отправлять ответ.When a service receives a duplex message, it looks at the ReplyTo element in that incoming message to determine where to send the reply. Если сообщение принимается по небезопасному каналу, ненадежный клиент может послать вредоносное сообщение с указанием компьютера для атаки в элементе ReplyTo, что приведет к отказу в обслуживании (DOS) этого компьютера.If the channel that is used to receive the message is not secured, then an untrusted client could send a malicious message with a target machine's ReplyTo, leading to a denial of service (DOS) of that target machine.

Параметры Out и RefOut and Ref Parameters

В большинстве случаев можно использовать параметры in (ByVal в Visual Basic) и out и ref (ByRef в Visual Basic).In most cases, you can use in parameters (ByVal in Visual Basic) and out and ref parameters (ByRef in Visual Basic). Так как параметры out и ref оба указывают на то, что операция возвращает данные, сигнатура операции, такая, как показана далее, задает необходимость операции запрос-ответ, несмотря на то что сигнатура операции возвращает void.Because both out and ref parameters indicate that data is returned from an operation, an operation signature such as the following specifies that a request/reply operation is required even though the operation signature returns void.

[ServiceContractAttribute]  
public interface IMyContract  
{  
  [OperationContractAttribute]  
  public void PopulateData(ref CustomDataType data);  
}  

Ниже приведен эквивалентный код Visual Basic.The following is the equivalent Visual Basic code.

<ServiceContractAttribute()> _  
Public Interface IMyContract  
  <OperationContractAttribute()> _  
  Public Sub PopulateData(ByRef data As CustomDataType)  
End Interface  

Исключение составляют только те случаи, когда сигнатура имеет определенную структуру.The only exceptions are those cases in which your signature has a particular structure. Например, можно использовать привязку NetMsmqBinding для взаимодействия с клиентами, только если метод, использованный для объявления операции, возвращает void; может не быть выходного значения, является ли оно возвращаемым значением, параметром ref или out.For example, you can use the NetMsmqBinding binding to communicate with clients only if the method used to declare an operation returns void; there can be no output value, whether it is a return value, ref, or out parameter.

Помимо этого, использование параметров out или ref требует, чтобы у операции было базовое ответное сообщение для передачи обратно измененного объекта.In addition, using out or ref parameters requires that the operation have an underlying response message to carry back the modified object. Если операция является односторонней, во время выполнения создается исключение InvalidOperationException.If your operation is a one-way operation, an InvalidOperationException exception is thrown at runtime.

Определение уровня защиты сообщений для контрактаSpecify Message Protection Level on the Contract

При создании контракта необходимо также определить уровень защиты сообщений служб, реализующих этот контракт.When designing your contract, you must also decide the message protection level of services that implement your contract. Это необходимо, только если к привязке применена безопасность сообщений в конечной точке контракта.This is necessary only if message security is applied to the binding in the contract's endpoint. Если для привязки безопасность отключена (то есть, если привязка, предоставляемая системой, присваивает объекту System.ServiceModel.SecurityMode значение SecurityMode.None), то не нужно определять уровень безопасности сообщений для контракта.If the binding has security turned off (that is, if the system-provided binding sets the System.ServiceModel.SecurityMode to the value SecurityMode.None) then you do not have to decide on the message protection level for the contract. В большинстве случаев привязки, предоставляемые системой, с безопасностью на уровне сообщений предоставляют достаточный уровень защиты и нет необходимости рассматривать уровень защиты для каждой операции или для каждого сообщения.In most cases, system-provided bindings with message-level security applied provide a sufficient protection level and you do not have to consider the protection level for each operation or for each message.

Уровень защиты - это значение, которое определяет для сообщений (или частей сообщений), поддерживающих службу, подписываются ли они, подписываются и шифруются или отправляются без подписи и шифровки.The protection level is a value that specifies whether the messages (or message parts) that support a service are signed, signed and encrypted, or sent without signatures or encryption. Уровень защиты может быть задан в различных областях: на уровне службы, для конкретной операции, для сообщения операции или для части сообщения.The protection level can be set at various scopes: At the service level, for a particular operation, for a message within that operation, or a message part. Значения, заданные для более широкой области, становятся значениями по умолчанию для более узких областей, если не переопределить их явным образом.Values set at one scope become the default value for smaller scopes unless explicitly overridden. Если конфигурация привязки не может обеспечить минимальный необходимый уровень защиты для контракта, создается исключение.If a binding configuration cannot provide the required minimum protection level for the contract, an exception is thrown. Если для контракта явно не задано значений уровня защиты, и если привязка имеет безопасность сообщений, уровнем защиты всех сообщений управляет конфигурация привязки.And when no protection level values are explicitly set on the contract, the binding configuration controls the protection level for all messages if the binding has message security. Это поведение установлено по умолчанию.This is the default behavior.

Важно!

Решение явно задать для различных областей контракта уровень защиты меньше максимального ProtectionLevel.EncryptAndSign обычно является компромиссом между степенью защиты и улучшением производительности.Deciding whether to explicitly set various scopes of a contract to less than the full protection level of ProtectionLevel.EncryptAndSign is generally a decision that trades some degree of security for increased performance. В таких случаях решения должны опираться на вид операций и ценность передаваемых данных.In these cases, your decisions must revolve around your operations and the value of the data they exchange. Дополнительные сведения см. в разделе Защита служб.For more information, see Securing Services.

Например, в следующем примере кода не задается ни свойствоProtectionLevel, ни свойство ProtectionLevel контракта.For example, the following code example does not set either the ProtectionLevel or the ProtectionLevel property on the contract.

[ServiceContract]  
public interface ISampleService  
{  
  [OperationContractAttribute]  
  public string GetString();  
  
  [OperationContractAttribute]  
  public int GetInt();    
}  

Ниже приведен эквивалентный код Visual Basic.The following is the equivalent Visual Basic code.

<ServiceContractAttribute()> _  
Public Interface ISampleService  
  
  <OperationContractAttribute()> _  
  Public Function GetString()As String  
  
  <OperationContractAttribute()> _  
  Public Function GetData() As Integer  
  
End Interface  

При взаимодействии с реализацией ISampleService в конечной точке с привязкой WSHttpBinding по умолчанию (System.ServiceModel.SecurityMode по умолчанию, то есть значение Message), все сообщения зашифровываются и подписываются, так как это является уровнем защиты по умолчанию.When interacting with an ISampleService implementation in an endpoint with a default WSHttpBinding (the default System.ServiceModel.SecurityMode, which is Message), all messages are encrypted and signed because this is the default protection level. Однако при использовании службы ISampleService с привязкой BasicHttpBinding по умолчанию (SecurityMode по умолчанию, то есть значение None), все сообщения отправляются в текстовом виде, так как эта привязка не имеет безопасности и, следовательно, уровень защиты игнорируется (то есть сообщения не шифруются и не подписываются).However, when an ISampleService service is used with a default BasicHttpBinding (the default SecurityMode, which is None), all messages are sent as text because there is no security for this binding and so the protection level is ignored (that is, the messages are neither encrypted nor signed). Если изменить значение свойства SecurityMode на Message, то сообщения будут зашифровываться и подписываться, так как теперь таков будет уровень защиты по умолчанию для привязки.If the SecurityMode was changed to Message, then these messages would be encrypted and signed (because that would now be the binding's default protection level).

Если требуется явным образом задать или настроить требования по безопасности для контракта, задайте для свойства ProtectionLevel (или для любого из свойств ProtectionLevel более узкой области) уровень, требуемый для контракта службы.If you want to explicitly specify or adjust the protection requirements for your contract, set the ProtectionLevel property (or any of the ProtectionLevel properties at a smaller scope) to the level your service contract requires. В данном случае явная настройка требует, чтобы привязка поддерживала эту настройку по крайней мере для указанной области.In this case, using an explicit setting requires the binding to support that setting at a minimum for the scope used. Например, в следующем примере кода явно задается одно значение ProtectionLevel для операции GetGuid.For example, the following code example specifies one ProtectionLevel value explicitly, for the GetGuid operation.

[ServiceContract]  
public interface IExplicitProtectionLevelSampleService  
{  
  [OperationContractAttribute]  
  public string GetString();  
  
  [OperationContractAttribute(ProtectionLevel=ProtectionLevel.None)]  
  public int GetInt();    
  [OperationContractAttribute(ProtectionLevel=ProtectionLevel.EncryptAndSign)]  
  public int GetGuid();    
}  

Ниже приведен эквивалентный код Visual Basic.The following is the equivalent Visual Basic code.

<ServiceContract()> _   
Public Interface IExplicitProtectionLevelSampleService   
    <OperationContract()> _   
    Public Function GetString() As String   
    End Function   
  
    <OperationContract(ProtectionLevel := ProtectionLevel.None)> _   
    Public Function GetInt() As Integer   
    End Function   
  
    <OperationContractAttribute(ProtectionLevel := ProtectionLevel.EncryptAndSign)> _   
    Public Function GetGuid() As Integer   
    End Function   
  
End Interface  

Служба, реализующая этот контракт IExplicitProtectionLevelSampleService и имеющая конечную точку, где используется привязка WSHttpBinding по умолчанию (System.ServiceModel.SecurityMode по умолчанию, то есть значение Message) ведет себя следующим образом:A service that implements this IExplicitProtectionLevelSampleService contract and has an endpoint that uses the default WSHttpBinding (the default System.ServiceModel.SecurityMode, which is Message) has the following behavior:

  • Для операции GetString сообщения шифруются и подписываются.The GetString operation messages are encrypted and signed.

  • Для операции GetInt сообщения не шифруются и не подписываются, то есть отправляются как простой текст.The GetInt operation messages are sent as unencrypted and unsigned (that is, plain) text.

  • GetGuid операции System.Guid возвращается в зашифрованном подписанном сообщении.The GetGuid operation System.Guid is returned in a message that is encrypted and signed.

Дополнительные сведения об уровнях защиты и их использовании см. в разделе Основные сведения о уровне защиты.For more information about protection levels and how to use them, see Understanding Protection Level. Дополнительные сведения о безопасности см. в разделе Защита служб.For more information about security, see Securing Services.

Другие требования к сигнатуре операцииOther Operation Signature Requirements

Некоторые возможности приложения требуют определенного вида сигнатуры операции.Some application features require a particular kind of operation signature. Например, привязка NetMsmqBinding поддерживает устойчивые службы и клиенты, позволяющие перезапуск приложения при установленном подключении, при этом приложение продолжит работу с того места, где остановилось, и ни одно сообщение не будет потеряно.For example, the NetMsmqBinding binding supports durable services and clients, in which an application can restart in the middle of communication and pick up where it left off without missing any messages. (Дополнительные сведения см. в разделе очереди в WCF.) Однако устойчивые операции должны принимать только один параметр in и не иметь возвращаемого значения.(For more information, see Queues in WCF.) However, durable operations must take only one in parameter and have no return value.

Другой пример - использование типов Stream в операциях.Another example is the use of Stream types in operations. Так как параметр Stream включает в себя тело сообщения целиком, если входные или выходные данные (то есть параметр ref, параметр out или возвращаемое значение) принадлежат типу Stream, это должны быть единственные входные и выходные данные, заданные для операции.Because the Stream parameter includes the entire message body, if an input or an output (that is, ref parameter, out parameter, or return value) is of type Stream, then it must be the only input or output specified in your operation. Кроме того, параметр или тип возвращаемого значения должны являться объектами Stream, System.ServiceModel.Channels.Message или System.Xml.Serialization.IXmlSerializable.In addition, the parameter or return type must be either Stream, System.ServiceModel.Channels.Message, or System.Xml.Serialization.IXmlSerializable. Дополнительные сведения о потоках см. в разделе большие данные и потоковая передача.For more information about streams, see Large Data and Streaming.

Имена, пространства имен и запутываниеNames, Namespaces, and Obfuscation

Имена и пространства имен типов .NET в определениях контрактов и операций важны при преобразовании контрактов в WSDL и при создании и отправке сообщений контрактов.The names and namespaces of the .NET types in the definition of contracts and operations are significant when contracts are converted into WSDL and when contract messages are created and sent. Поэтому рекомендуется явно задавать имена и пространства имен контракта службы с помощью свойств Name и Namespace всех поддерживающих атрибутов контракта, например ServiceContractAttribute, OperationContractAttribute, DataContractAttribute, DataMemberAttribute и других атрибутов контракта.Therefore, it is strongly recommended that service contract names and namespaces are explicitly set using the Name and Namespace properties of all supporting contract attributes such as the ServiceContractAttribute, OperationContractAttribute, DataContractAttribute, DataMemberAttribute, and other contract attributes.

Одним из следствий этого является то, что если имена и пространства имен не заданы явно, применение обфускации IL для сборки изменяет имена типов и пространства имен контракта, что приводит к измененному коду WSDL и обмену сообщениями, который обычно завершается ошибкой.One result of this is that if the names and namespaces are not explicitly set, the use of IL obfuscation on the assembly alters the contract type names and namespaces and results in modified WSDL and wire exchanges that typically fail. Если вы не задаете явно имена и пространства имен контракта, но планируете использовать обфускацию, используйте атрибуты ObfuscationAttribute и ObfuscateAssemblyAttribute, чтобы предотвратить изменение имен и пространств имен контракта.If you do not set the contract names and namespaces explicitly but do intend to use obfuscation, use the ObfuscationAttribute and ObfuscateAssemblyAttribute attributes to prevent the modification of the contract type names and namespaces.

См. такжеSee also