ServiceContractAttribute Classe
Definição
Importante
Algumas informações dizem respeito a um produto pré-lançado que pode ser substancialmente modificado antes de ser lançado. A Microsoft não faz garantias, de forma expressa ou implícita, em relação à informação aqui apresentada.
Indica que uma interface ou classe define um contrato de serviço numa aplicação do Windows Communication Foundation (WCF).
public ref class ServiceContractAttribute sealed : Attribute
[System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Interface, AllowMultiple=false, Inherited=false)]
public sealed class ServiceContractAttribute : Attribute
[<System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Interface, AllowMultiple=false, Inherited=false)>]
type ServiceContractAttribute = class
inherit Attribute
Public NotInheritable Class ServiceContractAttribute
Inherits Attribute
- Herança
- Atributos
Exemplos
O exemplo de código seguinte mostra como aplicar o ServiceContractAttribute a uma interface para definir um contrato de serviço com um método de serviço, indicado OperationContractAttributepelo . Neste caso, o nível de proteção exigido das ligações para todas as mensagens é ProtectionLevel.EncryptAndSign.
O exemplo de código implementa então esse contrato na SampleService classe.
using System;
using System.Collections.Generic;
using System.Net.Security;
using System.ServiceModel;
using System.Text;
namespace Microsoft.WCF.Documentation
{
[ServiceContract(
Namespace="http://microsoft.wcf.documentation",
Name="SampleService",
ProtectionLevel=ProtectionLevel.EncryptAndSign
)]
public interface ISampleService{
[OperationContract]
string SampleMethod(string msg);
}
class SampleService : ISampleService
{
#region ISampleService Members
public string SampleMethod(string msg)
{
return "The service greets you: " + msg;
}
#endregion
}
}
Imports System.Collections.Generic
Imports System.Net.Security
Imports System.ServiceModel
Imports System.Text
Namespace Microsoft.WCF.Documentation
<ServiceContract(Namespace:="http://microsoft.wcf.documentation", Name:="SampleService", ProtectionLevel:=ProtectionLevel.EncryptAndSign)> _
Public Interface ISampleService
<OperationContract> _
Function SampleMethod(ByVal msg As String) As String
End Interface
Friend Class SampleService
Implements ISampleService
#Region "ISampleService Members"
Public Function SampleMethod(ByVal msg As String) As String Implements ISampleService.SampleMethod
Return "The service greets you: " & msg
End Function
#End Region
End Class
End Namespace
O exemplo de código seguinte mostra um ficheiro de configuração simples para o serviço anterior que cria um endpoint.
<configuration>
<system.serviceModel>
<services>
<service
name="Microsoft.WCF.Documentation.SampleService"
behaviorConfiguration="mex"
>
<host>
<baseAddresses>
<add baseAddress="http://localhost:8080/SampleService"/>
</baseAddresses>
</host>
<endpoint
address=""
binding="wsHttpBinding"
contract="Microsoft.WCF.Documentation.ISampleService"
/>
<endpoint
address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange"
/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="mex">
<serviceMetadata httpGetEnabled="true" httpGetUrl=""/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
O exemplo de código seguinte mostra um cliente simples que invoca o .SampleService
using System;
using System.ServiceModel;
using System.ServiceModel.Channels;
public class Client
{
public static void Main()
{
// Picks up configuration from the config file.
SampleServiceClient wcfClient = new SampleServiceClient();
try
{
// Making calls.
Console.WriteLine("Enter the greeting to send: ");
string greeting = Console.ReadLine();
Console.WriteLine("The service responded: " + wcfClient.SampleMethod(greeting));
Console.WriteLine("Press ENTER to exit:");
Console.ReadLine();
// Done with service.
wcfClient.Close();
Console.WriteLine("Done!");
}
catch (TimeoutException timeProblem)
{
Console.WriteLine("The service operation timed out. " + timeProblem.Message);
wcfClient.Abort();
Console.Read();
}
catch(CommunicationException commProblem)
{
Console.WriteLine("There was a communication problem. " + commProblem.Message);
wcfClient.Abort();
Console.Read();
}
}
}
Imports System.ServiceModel
Imports System.ServiceModel.Channels
Public Class Client
Public Shared Sub Main()
' Picks up configuration from the config file.
Dim wcfClient As New SampleServiceClient()
Try
' Making calls.
Console.WriteLine("Enter the greeting to send: ")
Dim greeting = Console.ReadLine()
Console.WriteLine("The service responded: " & wcfClient.SampleMethod(greeting))
Console.WriteLine("Press ENTER to exit:")
Console.ReadLine()
' Done with service.
wcfClient.Close()
Console.WriteLine("Done!")
Catch timeProblem As TimeoutException
Console.WriteLine("The service operation timed out. " & timeProblem.Message)
wcfClient.Abort()
Console.Read()
Catch commProblem As CommunicationException
Console.WriteLine("There was a communication problem. " & commProblem.Message)
wcfClient.Abort()
Console.Read()
End Try
End Sub
End Class
Observações
Use o ServiceContractAttribute atributo numa interface (ou classe) para definir um contrato de serviço. Depois, utiliza o OperationContractAttribute atributo num ou mais métodos de classe (ou interface) para definir as operações de serviço do contrato. Quando o contrato de serviço é implementado e combinado com um Bindings e um EndpointAddress objeto, o contrato de serviço é exposto para uso pelos clientes. Para uma visão geral do processo usando exemplos simples, consulte o Tutorial de Iniciação. Para mais informações sobre a criação de contratos de serviço, consulte Desenho e Implementação de Serviços.
A informação expressa por a ServiceContractAttribute e a sua interface está vagamente relacionada com o elemento Web Services Description Language (WSDL <portType> ). Um contrato de serviço é utilizado do lado do serviço para especificar o que o endpoint do serviço expõe aos chamadores. É também usado do lado do cliente para especificar o contrato do endpoint com o qual o cliente comunica e, no caso de contratos duplex, para especificar o contrato de callback (usando a propriedade CallbackContract ) que o cliente deve implementar para participar numa conversa duplex.
Note
Uma interface ou classe decorada ServiceContractAttribute com deve também ter pelo menos um método marcado com o OperationContractAttribute atributo para expor qualquer funcionalidade. Consulte a secção Exemplos para um exemplo de código da utilização mais simples dos dois atributos para definir e implementar um serviço.
Use as ServiceContractAttribute propriedades para modificar o contrato de serviço.
A ConfigurationName propriedade especifica o nome do elemento de serviço no ficheiro de configuração a utilizar.
As Name propriedades e Namespace controlam o nome e o espaço de nomes do contrato no elemento WSDL
<portType>.A SessionMode propriedade especifica se o contrato exige uma vinculação que suporte sessões.
A CallbackContract propriedade especifica o contrato de retorno numa conversa bidirecional (duplex).
As HasProtectionLevel propriedades e ProtectionLevel indicam se todas as mensagens que suportam o contrato têm um valor explícito ProtectionLevel e, em caso afirmativo, qual é esse nível.
Os serviços implementam contratos de serviço, que representam a troca de dados que um tipo de serviço suporta. Uma classe de serviço pode implementar um contrato de serviço (implementando uma interface marcada com ServiceContractAttribute que tem métodos marcados com OperationContractAttribute) ou pode ser marcada com e ServiceContractAttribute aplicar o OperationContractAttribute atributo aos seus próprios métodos. (Se uma classe implementar uma interface marcada com ServiceContractAttribute, não pode ser marcada ela própria com ServiceContractAttribute.) Os métodos nos tipos de serviço marcados com o OperationContractAttribute são tratados como parte de um contrato de serviço padrão especificado pelo próprio tipo de serviço. Para detalhes sobre as operações de serviço, veja OperationContractAttribute.
Por defeito, as Name propriedades e Namespace são o nome do tipo de contrato e http://tempuri.org, respetivamente, e ProtectionLevel é ProtectionLevel.None. Recomenda-se que os contratos de serviço definam explicitamente os seus nomes, namespaces e níveis de proteção usando estas propriedades. Fazê-lo cumpre dois objetivos. Primeiro, constrói um contrato que não está diretamente ligado à informação do tipo gerido, permitindo-lhe refatorar o seu código gerido e namespaces sem violar o contrato tal como é expresso em WSDL. Em segundo lugar, exigir explicitamente um certo nível de proteção no próprio contrato permite que o runtime valide se a configuração binding suporta esse nível de segurança, evitando que uma configuração deficiente exponha informações sensíveis. Para mais informações sobre os níveis de proteção, consulte Compreender o Nível de Protecção.
Para expor um serviço para uso por aplicações clientes, crie uma aplicação anfitriã para registar o seu endpoint de serviço com o Windows Communication Foundation (WCF). Pode hospedar serviços WCF usando os Serviços de Ativação do Windows (WAS), em aplicações de consola, aplicações do Windows Service, aplicações ASP.NET, aplicações Windows Forms ou qualquer outro tipo de domínio de aplicação.
Alojar no WAS é muito semelhante a criar uma aplicação ASP.NET. Para mais detalhes, veja Como: Hospedar um Serviço WCF no IIS.
Os clientes ou usam a interface do contrato de serviço (a interface marcada com ServiceContractAttribute) para criar um canal para o serviço ou usam os objetos do cliente (que combinam a informação do tipo da interface do contrato de serviço com a ClientBase<TChannel> classe) para comunicar com o seu serviço. Para detalhes sobre os canais dos clientes para os serviços, consulte a classe e a ChannelFactory<TChannel>Visão Geral do Cliente WCF.
Usar uma ServiceContractAttribute classe ou interface para herdar de outra ServiceContractAttribute classe ou interface estende o contrato pai. Por exemplo, se uma IChildContract interface for marcada com ServiceContractAttribute e herdada de outra interface contratual de serviço, IParentContract, o IChildContract contrato de serviço contém os métodos tanto IParentContract de como IChildContract. Estender contratos (seja em classes ou interfaces) é muito semelhante a estender classes e interfaces geridas.
A abordagem mais flexível para criar serviços é definir primeiro interfaces de contratos de serviço e depois fazer com que a sua classe de serviço implemente essa interface. (Esta é também a forma mais simples de construir os seus serviços se tiver de implementar contratos de serviço definidos por outros.) Construir serviços diretamente marcando uma classe com ServiceContractAttribute e os seus métodos com OperationContractAttribute trabalhos quando o serviço expõe apenas um contrato (mas esse contrato pode ser exposto por mais do que um endpoint).
Use a CallbackContract propriedade para indicar outro contrato de serviço que, quando ligado ao contrato de serviço original, defina uma troca de mensagens que pode fluir de duas formas de forma independente. Para obter detalhes, consulte CallbackContract.
Construtores
| Name | Description |
|---|---|
| ServiceContractAttribute() |
Inicializa uma nova instância da ServiceContractAttribute classe. |
Propriedades
| Name | Description |
|---|---|
| CallbackContract |
Obtém ou define o tipo de contrato de retorno de chamada quando o contrato é um contrato duplex. |
| ConfigurationName |
Obtém ou define o nome usado para localizar o serviço em um arquivo de configuração do aplicativo. |
| HasProtectionLevel |
Obtém um valor que indica se o membro tem um nível de proteção atribuído. |
| Name |
Obtém ou define o nome do |
| Namespace |
Obtém ou define o namespace do |
| ProtectionLevel |
Especifica se a vinculação do contrato deve suportar o valor do ProtectionLevel imóvel. |
| SessionMode |
Obtém ou define se as sessões são permitidas, não permitidas ou necessárias. |
| TypeId |
Quando implementado numa classe derivada, obtém um identificador único para esta Attribute. (Herdado de Attribute) |
Métodos
| Name | Description |
|---|---|
| Equals(Object) |
Devolve um valor que indica se esta instância é igual a um objeto especificado. (Herdado de Attribute) |
| GetHashCode() |
Devolve o código de hash para esta instância. (Herdado de Attribute) |
| GetType() |
Obtém o Type da instância atual. (Herdado de Object) |
| IsDefaultAttribute() |
Quando sobrescrito numa classe derivada, indica se o valor desta instância é o valor padrão para a classe derivada. (Herdado de Attribute) |
| Match(Object) |
Quando sobrescrito numa classe derivada, devolve um valor que indica se esta instância é igual a um objeto especificado. (Herdado de Attribute) |
| MemberwiseClone() |
Cria uma cópia superficial do atual Object. (Herdado de Object) |
| ToString() |
Devolve uma cadeia que representa o objeto atual. (Herdado de Object) |
Implementações de Interface Explícita
| Name | Description |
|---|---|
| _Attribute.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr) |
Mapeia um conjunto de nomes para um conjunto correspondente de identificadores de despacho. (Herdado de Attribute) |
| _Attribute.GetTypeInfo(UInt32, UInt32, IntPtr) |
Recupera a informação de tipo de um objeto, que pode ser usada para obter a informação de tipo para uma interface. (Herdado de Attribute) |
| _Attribute.GetTypeInfoCount(UInt32) |
Recupera o número de interfaces de informações de tipo que um objeto fornece (0 ou 1). (Herdado de Attribute) |
| _Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr) |
Proporciona acesso a propriedades e métodos expostos por um objeto. (Herdado de Attribute) |