Compartir a través de


ServiceContractAttribute Clase

Definición

Indica que una interfaz o una clase define un contrato de servicio en una aplicación 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, Inherited=false)]
public sealed class ServiceContractAttribute : Attribute
[<System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Interface, AllowMultiple=false, Inherited=false)>]
type ServiceContractAttribute = class
    inherit Attribute
[<System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Interface, Inherited=false)>]
type ServiceContractAttribute = class
    inherit Attribute
Public NotInheritable Class ServiceContractAttribute
Inherits Attribute
Herencia
ServiceContractAttribute
Atributos

Ejemplos

El ejemplo de código siguiente muestra cómo aplicar ServiceContractAttribute a una interfaz para definir un contrato de servicio con un método de servicio, indicado por OperationContractAttribute. En este caso, el nivel de protección requerido de los enlaces para todos los mensajes es ProtectionLevel.EncryptAndSign.

Después, el ejemplo de código implementará ese contrato en la clase SampleService.

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

El ejemplo de código siguiente muestra un archivo de configuración simple para el servicio anterior que crea un punto de conexión.

<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>

El ejemplo de código siguiente muestra un cliente que invoca el SampleService anterior.

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

Comentarios

Utilice el atributo ServiceContractAttribute en una interfaz (o clase) para definir un contrato de servicio. A continuación, utilice el atributo OperationContractAttribute en uno o varios de los métodos de clase (o interfaz) para definir las operaciones de servicio del contrato. Cuando el contrato de servicio se implementa y combina con enlaces y un EndpointAddress objeto , el contrato de servicio se expone para que lo usen los clientes. Para obtener información general sobre el proceso mediante ejemplos sencillos, consulte Introducción Tutorial. Para obtener más información sobre cómo crear contratos de servicio, vea Diseño e implementación de servicios.

La información expresada por ServiceContractAttribute y su interfaz está relacionada con el elemento <portType> del lenguaje de descripción de servicios Web (WSDL). Se usa un contrato de servicio en el lado del servicio para especificar lo que expone el punto de conexión del servicio a los autores de llamadas. También se utiliza en el lado del cliente para especificar el contrato del extremo con el que el cliente se comunica y, en el caso de contratos dúplex, para especificar el contrato de devolución de llamada (mediante la propiedad CallbackContract) que el cliente debe implementar para participar en una conversación dúplex.

Nota

Una interfaz o clase decorada con ServiceContractAttribute también debe tener por lo menos un método marcado con el atributo OperationContractAttribute para exponer cualquier funcionalidad. Consulte la sección Ejemplos para ver un ejemplo de código del uso más simple de los dos atributos para definir e implementar un servicio.

Utilice las propiedades ServiceContractAttribute para modificar el contrato de servicio.

  • La propiedad ConfigurationName especifica el nombre del elemento de servicio en el archivo de configuración que se va a usar.

  • Las propiedades Name y Namespace controlan el nombre y espacio de nombres del contrato en el elemento <portType> de WSDL.

  • La propiedad SessionMode especifica si el contrato requiere un enlace que admita sesiones.

  • La propiedad CallbackContract especifica el contrato de devolución en una conversación bidireccional (dúplex).

  • Las propiedades HasProtectionLevel y ProtectionLevel indican si todos los mensajes que admiten el contrato tienen un valor ProtectionLevel explícito, y en ese caso, qué nivel es.

Los servicios implementan contratos de servicio, que representan el intercambio de datos que un tipo de servicio admite. Una clase de servicio puede implementar un contrato de servicio (implementando una interfaz marcada con ServiceContractAttribute que tiene los métodos marcados con OperationContractAttribute) o se puede marcar con ServiceContractAttribute y aplicar el atributo OperationContractAttribute a sus propios métodos. (Si una clase implementa una interfaz marcada con ServiceContractAttribute, no se puede marcar por sí misma con ServiceContractAttribute). Los métodos de los tipos de servicio marcados con OperationContractAttribute se tratan como parte de un contrato de servicio predeterminado especificado por el propio tipo de servicio. Para obtener información detallada sobre las operaciones de servicio, consulte OperationContractAttribute.

De forma predeterminada, las propiedades Name y Namespace son el nombre del tipo de contrato y http://tempuri.org, respectivamente, y ProtectionLevel es ProtectionLevel.None. Se recomienda que los contratos de servicio definan explícitamente los nombres, espacios de nombres y niveles de protección mediante estas propiedades. Al hacerlo, se logran dos objetivos. Primero, se crea un contrato que no está conectado directamente a la información del tipo administrado, lo que le permite refactorizar su código y espacios de nombres administrados sin interrumpir el contrato tal y como se expresa en WSDL. Segundo, exigir explícitamente un cierto nivel de protección en el propio contrato permite al tiempo de ejecución validar si la configuración de enlace admite ese nivel de seguridad, con lo que se evita que una configuración poco definida haga visible información confidencial. Para obtener más información sobre los niveles de protección, consulte Descripción del nivel de protección.

Para exponer un servicio para que lo usen las aplicaciones cliente, cree una aplicación host para registrar el punto de conexión de servicio con Windows Communication Foundation (WCF). Puede hospedar servicios WCF mediante Windows Activation Services (WAS), en aplicaciones de consola, aplicaciones de servicio Windows, aplicaciones de ASP.NET, aplicaciones Windows Forms o cualquier otro tipo de dominio de aplicación.

Hospedar en WAS es muy similar a crear una aplicación ASP.NET. Para obtener más información, vea Cómo: Hospedar un servicio WCF en IIS.

Los clientes utilizan la interfaz de contrato de servicio (la interfaz marcada con ServiceContractAttribute) para crear un canal al servicio o utilizan los objetos de cliente (que combinan la información del tipo de la interfaz de contrato de servicio con la clase ClientBase<TChannel>) para comunicar con su servicio. Para obtener más información sobre los canales de cliente a los servicios, consulte la ChannelFactory<TChannel> clase e Información general del cliente WCF.

Utilizar una clase ServiceContractAttribute o interfaz para heredar de otra clase ServiceContractAttribute o interfaz extiende el contrato primario. Por ejemplo, si una interfaz IChildContract se marca con ServiceContractAttribute y hereda de otra interfaz de contrato de servicio, IParentContract, el contrato de servicio IChildContract contiene los métodos de IParentContract e IChildContract. Extender los contratos (en clases o interfaces) es muy similar a extender clases e interfaces administradas.

El enfoque más flexible para crear los servicios es definir primero las interfaces de contrato de servicio y después que la clase de servicio implemente esa interfaz. (Esta es también la manera más sencilla de crear los servicios si debe implementar contratos de servicio definidos por otros usuarios). La creación de servicios directamente marcando una clase con ServiceContractAttribute y sus métodos con OperationContractAttribute funciona cuando el servicio expone solo un contrato (pero ese contrato puede exponerse por más de un punto de conexión).

Utilice la CallbackContract propiedad para indicar otro contrato de servicio que, al enlazarse con el contrato de servicio original, defina un intercambio de mensajes que pueda fluir de dos maneras de forma independiente. Para obtener información detallada, vea CallbackContract.

Constructores

ServiceContractAttribute()

Inicializa una nueva instancia de la clase ServiceContractAttribute.

Propiedades

CallbackContract

Obtiene o establece el tipo de contrato de devolución de llamada cuando el contrato es un contrato dúplex.

ConfigurationName

Obtiene o establece el nombre utilizado para buscar el servicio en un archivo de configuración de la aplicación.

HasProtectionLevel

Obtiene un valor que indica si el miembro tiene un nivel de protección asignado.

Name

Obtiene o establece el nombre para el elemento <portType> en el lenguaje de descripción de servicios Web (WSDL).

Namespace

Obtiene o establece el espacio de nombres del elemento <portType> en el lenguaje de descripción de servicios Web (WSDL).

ProtectionLevel

Especifica si el enlace para el contrato debe admitir el valor de la propiedad ProtectionLevel.

SessionMode

Obtiene o establece si se permiten sesiones, si no se permiten o si son necesarias.

TypeId

Cuando se implementa en una clase derivada, obtiene un identificador único para este Attribute.

(Heredado de Attribute)

Métodos

Equals(Object)

Devuelve un valor que indica si esta instancia es igual que un objeto especificado.

(Heredado de Attribute)
GetHashCode()

Devuelve el código hash de esta instancia.

(Heredado de Attribute)
GetType()

Obtiene el Type de la instancia actual.

(Heredado de Object)
IsDefaultAttribute()

Si se reemplaza en una clase derivada, indica si el valor de esta instancia es el valor predeterminado de la clase derivada.

(Heredado de Attribute)
Match(Object)

Cuando se invalida en una clase derivada, devuelve un valor que indica si esta instancia es igual a un objeto especificado.

(Heredado de Attribute)
MemberwiseClone()

Crea una copia superficial del Object actual.

(Heredado de Object)
ToString()

Devuelve una cadena que representa el objeto actual.

(Heredado de Object)

Implementaciones de interfaz explícitas

_Attribute.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr)

Asigna un conjunto de nombres a un conjunto correspondiente de identificadores de envío.

(Heredado de Attribute)
_Attribute.GetTypeInfo(UInt32, UInt32, IntPtr)

Obtiene la información de tipos de un objeto, que puede utilizarse para obtener la información de tipos de una interfaz.

(Heredado de Attribute)
_Attribute.GetTypeInfoCount(UInt32)

Recupera el número de interfaces de información de tipo que proporciona un objeto (0 ó 1).

(Heredado de Attribute)
_Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr)

Proporciona acceso a las propiedades y los métodos expuestos por un objeto.

(Heredado de Attribute)

Se aplica a

Consulte también