ServiceContractAttribute ServiceContractAttribute ServiceContractAttribute ServiceContractAttribute Class

Definición

Indica que una interfaz o una clase define un contrato de servicio en una aplicación Windows Communication Foundation (WCF).Indicates that an interface or a class defines a service contract in a Windows Communication Foundation (WCF) application.

public ref class ServiceContractAttribute sealed : Attribute
[System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Interface, Inherited=false)]
[System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Interface, AllowMultiple=false, Inherited=false)]
public sealed class ServiceContractAttribute : Attribute
type ServiceContractAttribute = class
    inherit Attribute
Public NotInheritable Class ServiceContractAttribute
Inherits Attribute
Herencia
ServiceContractAttributeServiceContractAttributeServiceContractAttributeServiceContractAttribute
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.The following code example shows how to apply the ServiceContractAttribute to an interface to define a service contract with one service method, indicated by the OperationContractAttribute. En este caso, el nivel de protección requerido de los enlaces para todos los mensajes es ProtectionLevel.EncryptAndSign.In this case, the protection level required of bindings for all messages is ProtectionLevel.EncryptAndSign.

Después, el ejemplo de código implementará ese contrato en la clase SampleService.The code example then implements that contract on the SampleService class.

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.The following code example shows a simple configuration file for the preceding service that creates one 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>

El ejemplo de código siguiente muestra un cliente que invoca el SampleService anterior.The following code example shows a simple client that invokes the preceding 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

Comentarios

Utilice el atributo ServiceContractAttribute en una interfaz (o clase) para definir un contrato de servicio.Use the ServiceContractAttribute attribute on an interface (or class) to define a service contract. 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.Then use the OperationContractAttribute attribute on one or more of the class (or interface) methods to define the contract's service operations. Cuando el contrato de servicio se implementa y se combina con un enlace y un objeto EndpointAddress, el contrato de servicio se expone para que lo usen los clientes.When the service contract is implemented and combined with a Bindings and an EndpointAddress object, the service contract is exposed for use by clients. Para obtener información general sobre el proceso con ejemplos sencillos, vea Introducción tutorial.For an overview of the process using simple examples, see Getting Started Tutorial. Para obtener más información sobre la creación de contratos de servicio, vea diseñar e implementar servicios.For more information about creating service contracts, see Designing and Implementing Services.

La información expresada por ServiceContractAttribute y su interfaz está relacionada con el elemento <portType> del lenguaje de descripción de servicios Web (WSDL).The information expressed by a ServiceContractAttribute and its interface is loosely related to the Web Services Description Language (WSDL) <portType> element. Un contrato de servicio se usa en el lado del servicio para especificar lo que el punto de conexión del servicio expone a los autores de las llamadas.A service contract is used on the service side to specify what the service's endpoint exposes to callers. 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.It is also used on the client side to specify the contract of the endpoint with which the client communicates and, in the case of duplex contracts, to specify the callback contract (using the CallbackContract property) that the client must implement in order to participate in a duplex conversation.

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.An interface or class that is decorated with ServiceContractAttribute must also have at least one method marked with the OperationContractAttribute attribute to expose any functionality. 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.See the Examples section for a code example of the simplest use of the two attributes to define and implement a service.

Utilice las propiedades ServiceContractAttribute para modificar el contrato de servicio.Use the ServiceContractAttribute properties to modify the service contract.

  • La propiedad ConfigurationName especifica el nombre del elemento de servicio en el archivo de configuración que se va a usar.The ConfigurationName property specifies the name of the service element in the configuration file to use.

  • Las propiedades Name y Namespace controlan el nombre y espacio de nombres del contrato en el elemento <portType> de WSDL.The Name and Namespace properties control the name and namespace of the contract in the WSDL <portType> element.

  • La propiedad SessionMode especifica si el contrato requiere un enlace que admita sesiones.The SessionMode property specifies whether the contract requires a binding that supports sessions.

  • La propiedad CallbackContract especifica el contrato de devolución en una conversación bidireccional (dúplex).The CallbackContract property specifies the return contract in a two-way (duplex) conversation.

  • 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.The HasProtectionLevel and ProtectionLevel properties indicate whether all messages supporting the contract have a explicit ProtectionLevel value, and if so, what that level is.

Los servicios implementan contratos de servicio, que representan el intercambio de datos que un tipo de servicio admite.Services implement service contracts, which represent the data exchange that a service type supports. 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.A service class can implement a service contract (by implementing an interface marked with ServiceContractAttribute that has methods marked with OperationContractAttribute) or it can be marked with the ServiceContractAttribute and apply the OperationContractAttribute attribute to its own methods. (Si una clase implementa una interfaz marcada con ServiceContractAttribute, no se podrá marcar con ServiceContractAttribute.) Los métodos en los tipos de servicio que se marcan con OperationContractAttribute se tratan como la parte de un contrato de servicio predeterminado especificado por el propio tipo de servicio.(If a class implements an interface marked with ServiceContractAttribute, it cannot be itself marked with ServiceContractAttribute.) Methods on service types that are marked with the OperationContractAttribute are treated as part of a default service contract specified by the service type itself. Para obtener información detallada sobre las operaciones de servicio, consulte OperationContractAttribute.For details about service operations, see 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.By default, the Name and Namespace properties are the name of the contract type and http://tempuri.org, respectively, and ProtectionLevel is 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.It is recommended that service contracts explicitly set their names, namespaces, and protection levels using these properties. Al hacerlo, se logran dos objetivos.Doing so accomplishes two goals. 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.First, it builds a contract that is not directly connected to the managed type information, enabling you to refactor your managed code and namespaces without breaking the contract as it is expressed in 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.Second, explicitly requiring a certain level of protection on the contract itself enables the runtime to validate whether the binding configuration supports that level of security, preventing poor configuration from exposing sensitive information. Para obtener más información acerca de los niveles de protección, consulte Descripción del nivel de protección.For more information about protection levels, see Understanding Protection Level.

Para exponer un servicio para que lo usen las aplicaciones cliente, cree una aplicación host para registrar su punto de conexión de servicio con Windows Communication Foundation (WCF).To expose a service for use by client applications, create a host application to register your service endpoint with Windows Communication Foundation (WCF). Puede hospedar servicios WCF mediante los servicios de activación de Windows (WAS), en aplicaciones de consola, aplicaciones de servicios de Windows, aplicaciones de ASP.NET, aplicaciones Windows Forms o cualquier otro tipo de dominio de aplicación.You can host WCF services using Windows Activation Services (WAS), in console applications, Windows Service applications, ASP.NET applications, Windows Forms applications, or any other kind of application domain.

Hospedar en WAS es muy similar a crear una aplicación ASP.NET.Hosting in the WAS is very similar to creating an ASP.NET application. Para obtener más detalles, vea [Cómo: Hospede un servicio WCF en IIS @ no__t-0.For details, see How to: Host a WCF Service in 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.Clients either use the service contract interface (the interface marked with ServiceContractAttribute) to create a channel to the service or they use the client objects (which combine the type information of the service contract interface with the ClientBase<TChannel> class) to communicate with your service. Para obtener más información sobre los canales de cliente a los servicios, consulte la clase ChannelFactory<TChannel> y la información general del cliente de WCF.For details on client channels to services, see the ChannelFactory<TChannel> class and WCF Client Overview.

Utilizar una clase ServiceContractAttribute o interfaz para heredar de otra clase ServiceContractAttribute o interfaz extiende el contrato primario.Using a ServiceContractAttribute class or interface to inherit from another ServiceContractAttribute class or interface extends the parent contract. 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.For example, if an IChildContract interface is marked with ServiceContractAttribute and inherited from another service contract interface, IParentContract, the IChildContract service contract contains the methods of both IParentContract and IChildContract. Extender los contratos (en clases o interfaces) es muy similar a extender clases e interfaces administradas.Extending contracts (whether on classes or interfaces) is very similar to extending managed classes and interfaces.

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.The most flexible approach to creating services is to define service contract interfaces first and then have your service class implement that interface. (Ésta también es la manera más simple de crear sus servicios si debe implementar contratos de servicio definidos por otros.) Crear servicios directamente marcando una clase con ServiceContractAttribute y sus métodos con OperationContractAttribute funciona cuando el servicio expone sólo un contrato (aunque más de un punto de conexión pueden exponer ese contrato).(This is also the simplest way to build your services if you must implement service contracts that have been defined by others.) Building services directly by marking a class with ServiceContractAttribute and its methods with OperationContractAttribute works when the service exposes only one contract (but that contract can be exposed by more than one endpoint).

Use la propiedad CallbackContract para indicar otro contrato de servicio que, cuando esté enlazado con el contrato de servicio original, defina un intercambio de mensajes que pueda fluir de dos maneras de manera independiente.Use the CallbackContract property to indicate another service contract that, when bound together with the original service contract, define a message exchange that can flow in two ways independently. Para obtener información detallada, vea CallbackContract.For details, see CallbackContract.

Constructores

ServiceContractAttribute() ServiceContractAttribute() ServiceContractAttribute() ServiceContractAttribute()

Inicializa una nueva instancia de la clase ServiceContractAttribute.Initializes a new instance of the ServiceContractAttribute class.

Propiedades

CallbackContract CallbackContract CallbackContract CallbackContract

Obtiene o establece el tipo de contrato de devolución de llamada cuando el contrato es un contrato dúplex.Gets or sets the type of callback contract when the contract is a duplex contract.

ConfigurationName ConfigurationName ConfigurationName ConfigurationName

Obtiene o establece el nombre utilizado para buscar el servicio en un archivo de configuración de la aplicación.Gets or sets the name used to locate the service in an application configuration file.

HasProtectionLevel HasProtectionLevel HasProtectionLevel HasProtectionLevel

Obtiene un valor que indica si el miembro tiene un nivel de protección asignado.Gets a value that indicates whether the member has a protection level assigned.

Name Name Name Name

Obtiene o establece el nombre para el elemento <portType> en el lenguaje de descripción de servicios Web (WSDL).Gets or sets the name for the <portType> element in Web Services Description Language (WSDL).

Namespace Namespace Namespace Namespace

Obtiene o establece el espacio de nombres del elemento <portType> en el lenguaje de descripción de servicios Web (WSDL).Gets or sets the namespace of the <portType> element in Web Services Description Language (WSDL).

ProtectionLevel ProtectionLevel ProtectionLevel ProtectionLevel

Especifica si el enlace para el contrato debe admitir el valor de la propiedad ProtectionLevel.Specifies whether the binding for the contract must support the value of the ProtectionLevel property.

SessionMode SessionMode SessionMode SessionMode

Obtiene o establece si se permiten sesiones, si no se permiten o si son necesarias.Gets or sets whether sessions are allowed, not allowed or required.

TypeId TypeId TypeId TypeId

Cuando se implementa en una clase derivada, obtiene un identificador único para este Attribute.When implemented in a derived class, gets a unique identifier for this Attribute.

(Inherited from Attribute)

Métodos

Equals(Object) Equals(Object) Equals(Object) Equals(Object)

Devuelve un valor que indica si esta instancia es igual que un objeto especificado.Returns a value that indicates whether this instance is equal to a specified object.

(Inherited from Attribute)
GetHashCode() GetHashCode() GetHashCode() GetHashCode()

Devuelve el código hash de esta instancia.Returns the hash code for this instance.

(Inherited from Attribute)
GetType() GetType() GetType() GetType()

Obtiene el Type de la instancia actual.Gets the Type of the current instance.

(Inherited from Object)
IsDefaultAttribute() IsDefaultAttribute() IsDefaultAttribute() IsDefaultAttribute()

Si se reemplaza en una clase derivada, indica si el valor de esta instancia es el valor predeterminado de la clase derivada.When overridden in a derived class, indicates whether the value of this instance is the default value for the derived class.

(Inherited from Attribute)
Match(Object) Match(Object) Match(Object) Match(Object)

Cuando se invalida en una clase derivada, devuelve un valor que indica si esta instancia es igual a un objeto especificado.When overridden in a derived class, returns a value that indicates whether this instance equals a specified object.

(Inherited from Attribute)
MemberwiseClone() MemberwiseClone() MemberwiseClone() MemberwiseClone()

Crea una copia superficial del objeto Object actual.Creates a shallow copy of the current Object.

(Inherited from Object)
ToString() ToString() ToString() ToString()

Devuelve una cadena que representa el objeto actual.Returns a string that represents the current object.

(Inherited from Object)

Implementaciones de interfaz explícitas

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

Asigna un conjunto de nombres a un conjunto correspondiente de identificadores de envío.Maps a set of names to a corresponding set of dispatch identifiers.

(Inherited from Attribute)
_Attribute.GetTypeInfo(UInt32, UInt32, IntPtr) _Attribute.GetTypeInfo(UInt32, UInt32, IntPtr) _Attribute.GetTypeInfo(UInt32, UInt32, IntPtr) _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.Retrieves the type information for an object, which can be used to get the type information for an interface.

(Inherited from Attribute)
_Attribute.GetTypeInfoCount(UInt32) _Attribute.GetTypeInfoCount(UInt32) _Attribute.GetTypeInfoCount(UInt32) _Attribute.GetTypeInfoCount(UInt32)

Recupera el número de interfaces de información de tipo que proporciona un objeto (0 ó 1).Retrieves the number of type information interfaces that an object provides (either 0 or 1).

(Inherited from Attribute)
_Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr) _Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr) _Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr) _Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr)

Proporciona acceso a las propiedades y los métodos expuestos por un objeto.Provides access to properties and methods exposed by an object.

(Inherited from Attribute)

Se aplica a

Consulte también: