ServiceContractAttribute ServiceContractAttribute ServiceContractAttribute ServiceContractAttribute Class

Definizione

Indica che un'interfaccia o una classe definisce un contratto di servizio in un'applicazione 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
Ereditarietà
ServiceContractAttributeServiceContractAttributeServiceContractAttributeServiceContractAttribute
Attributi

Esempi

Nell'esempio di codice seguente viene mostrato come applicare l'attributo ServiceContractAttribute a un'interfaccia per definire un contratto di servizio avente un solo metodo di servizio, indicato dall'attributo 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. In questo caso, il livello di protezione che le associazioni devono applicare a tutti i messaggi è ProtectionLevel.EncryptAndSign.In this case, the protection level required of bindings for all messages is ProtectionLevel.EncryptAndSign.

L'esempio di codice prevede quindi l'implementazione del suddetto contratto nella classe 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
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

Nell'esempio di codice seguente viene mostrato un semplice file di configurazione del servizio precedente che crea un solo endpoint.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>

Nell'esempio di codice seguente viene mostrato un semplice client che richiama la classe SampleService precedente.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
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

Commenti

Utilizzare l'attributo ServiceContractAttribute su un'interfaccia (o su una classe) per definire un contratto di servizio.Use the ServiceContractAttribute attribute on an interface (or class) to define a service contract. Utilizzare quindi l'attributo OperationContractAttribute in uno o più metodi della classe (o dell'interfaccia) per definire le operazioni di servizio del contratto.Then use the OperationContractAttribute attribute on one or more of the class (or interface) methods to define the contract's service operations. Quando il contratto di servizio viene implementato e combinato con un associazioni e un EndpointAddress dell'oggetto, il contratto di servizio viene esposta per l'uso da parte dei client.When the service contract is implemented and combined with a Bindings and an EndpointAddress object, the service contract is exposed for use by clients. Per una panoramica del processo su esempi semplici, vedere esercitazione introduttiva.For an overview of the process using simple examples, see Getting Started Tutorial. Per altre informazioni sulla creazione di contratti di servizio, vedere progettazione e implementazione di servizi.For more information about creating service contracts, see Designing and Implementing Services.

Le informazioni espresse da un attributo ServiceContractAttribute e dalla relativa interfaccia presentano una correlazione ridotta con l'elemento <portType> del linguaggio WSDL (Web Services Description Language).The information expressed by a ServiceContractAttribute and its interface is loosely related to the Web Services Description Language (WSDL) <portType> element. Un contratto di servizio viene utilizzato sul lato del servizio per specificare quali endpoint del servizio espone ai chiamanti.A service contract is used on the service side to specify what the service's endpoint exposes to callers. I contratti di servizio vengono inoltre utilizzati sul lato client per specificare il contratto dell'endpoint con cui il client comunica e, se tale contratto è duplex, per specificare (mediante la proprietà CallbackContract) il contratto di callback che il client deve implementare per poter partecipare a una conversazione duplex.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

Un'interfaccia o una classe decorata con l'attributo ServiceContractAttribute deve inoltre presentare almeno un metodo contrassegnato con l'attributo OperationContractAttribute per esporre le proprie funzionalità.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. Nella sezione degli esempi è disponibile un esempio di codice che descrive una procedura semplicissima per definire e implementare un servizio tramite questi due attributi.See the Examples section for a code example of the simplest use of the two attributes to define and implement a service.

Utilizzare le proprietà dell'attributo ServiceContractAttribute per modificare il contratto di servizio.Use the ServiceContractAttribute properties to modify the service contract.

  • La proprietà ConfigurationName specifica il nome dell'elemento di servizio da utilizzare fra quelli contenuti nel file di configurazione.The ConfigurationName property specifies the name of the service element in the configuration file to use.

  • Le proprietà Name e Namespace controllano il nome e lo spazio dei nomi del contratto nell'elemento <portType> del linguaggio WSDL.The Name and Namespace properties control the name and namespace of the contract in the WSDL <portType> element.

  • La proprietà SessionMode specifica se il contratto richiede un'associazione che supporta le sessioni.The SessionMode property specifies whether the contract requires a binding that supports sessions.

  • La proprietà CallbackContract specifica il contratto di callback in una conversazione bidirezionale (duplex).The CallbackContract property specifies the return contract in a two-way (duplex) conversation.

  • Le proprietà HasProtectionLevel e ProtectionLevel indicano se la proprietà ProtectionLevel è stata definita in modo esplicito per tutti i messaggi che supportano il contratto e, in tal caso, il valore impostato per questa proprietà.The HasProtectionLevel and ProtectionLevel properties indicate whether all messages supporting the contract have a explicit ProtectionLevel value, and if so, what that level is.

I servizi implementano i contratti di servizio, che rappresentano lo scambio di dati supportato da un tipo di servizio.Services implement service contracts, which represent the data exchange that a service type supports. Una classe di servizio può implementare un contratto di servizio mediante l'implementazione di un'interfaccia contrassegnata con l'attributo ServiceContractAttribute e che presenta metodi contrassegnati con l'attributo OperationContractAttribute. In alternativa, una classe di servizio può essere contrassegnata con l'attributo ServiceContractAttribute e applicare l'attributo OperationContractAttribute ai propri metodi.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. Le classi che implementano un'interfaccia contrassegnata con l'attributo ServiceContractAttribute non possono essere contrassegnate con l'attributo ServiceContractAttribute. I metodi applicabili ai tipi di servizio contrassegnati con l'attributo OperationContractAttribute sono trattati come parte di un contratto di servizio predefinito specificato dal tipo di servizio stesso.(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. Per informazioni dettagliate sulle operazioni di servizio, vedere OperationContractAttribute.For details about service operations, see OperationContractAttribute.

Per impostazione predefinita, le proprietà Name e Namespace corrispondono rispettivamente al nome del tipo di contratto e allo spazio dei nomi http://tempuri.org e la proprietà ProtectionLevel è impostata su 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. È consigliabile utilizzare queste proprietà per impostare in modo esplicito i nomi, gli spazi dei nomi e i livelli di protezione dei contratti di servizio.It is recommended that service contracts explicitly set their names, namespaces, and protection levels using these properties. Ciò consente di raggiungere due obiettivi.Doing so accomplishes two goals. Il primo è che il contratto compilato con queste proprietà non è connesso direttamente alle informazioni sui tipi gestiti, il che consente di eseguire il refactoring del codice e degli spazi dei nomi gestiti senza violare il contratto secondo quanto espresso in 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. Il secondo è che la richiesta esplicita di un certo livello di protezione all'interno del contratto stesso consente di verificare in fase di esecuzione se la configurazione dell'associazione supporta tale livello di sicurezza. Ciò consente di evitare la divulgazione di informazioni riservate a causa di una configurazione inappropriata.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. Per altre informazioni sui livelli di protezione, vedere Understanding Protection Level.For more information about protection levels, see Understanding Protection Level.

Per esporre un servizio per l'utilizzo dalle applicazioni client, creare un'applicazione host per registrare l'endpoint di servizio 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). È possibile ospitare servizi WCF mediante Windows Activation Services (WAS), in applicazioni console, applicazioni di servizio di Windows, le applicazioni ASP.NET, applicazioni Windows Forms o qualsiasi altro tipo di dominio dell'applicazione.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.

L'hosting in WAS è molto simile alla creazione di un'applicazione ASP.NET.Hosting in the WAS is very similar to creating an ASP.NET application. Per informazioni dettagliate, vedere Procedura: Ospitare un servizio WCF in IIS.For details, see How to: Host a WCF Service in IIS.

I client utilizzano l'interfaccia del contratto di servizio (ovvero l'interfaccia contrassegnata con l'attributo ServiceContractAttribute) per creare un canale connesso al servizio oppure utilizzano gli oggetti client (che combinano le informazioni sui tipi dell'interfaccia del contratto di servizio con la classe ClientBase<TChannel> ) per comunicare con il servizio.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. Per informazioni dettagliate sui canali client ai servizi, vedere la ChannelFactory<TChannel> classe e WCF Client Overview.For details on client channels to services, see the ChannelFactory<TChannel> class and WCF Client Overview.

L'utilizzo di una classe o di un'interfaccia ServiceContractAttribute per ereditare da un'altra classe o interfaccia ServiceContractAttribute consente di estendere il contratto padre.Using a ServiceContractAttribute class or interface to inherit from another ServiceContractAttribute class or interface extends the parent contract. Ad esempio, se un'interfaccia IChildContract è contrassegnata con l'attributo ServiceContractAttribute e ha ereditato da un'altra interfaccia di contratto di servizio, ad esempio IParentContract, il contratto di servizio IChildContract contiene sia i metodi dell'interfaccia IParentContract sia i metodi di dell'interfaccia 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. L'estensione dei contratti (sia di classi sia di interfacce) è molto simile all'estensione di classi e interfacce gestite.Extending contracts (whether on classes or interfaces) is very similar to extending managed classes and interfaces.

L'approccio più flessibile alla creazione dei servizi è definire anzitutto l'interfaccia del contratto di servizio e quindi fare in modo che la classe di servizio implementi tale interfaccia.The most flexible approach to creating services is to define service contract interfaces first and then have your service class implement that interface. Questo approccio è inoltre il modo più semplice per compilare i servizi se occorre implementare contratti di servizio definiti da terzi. La compilazione dei servizi in modo diretto tramite l'applicazione dell'attributo ServiceContractAttribute a una classe e dell'attributo OperationContractAttribute ai metodi di tale classe rappresenta un approccio efficace quando il servizio espone un solo contratto, che tuttavia può essere esposto da più di un endpoint.(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).

Usare il CallbackContract proprietà per indicare un altro contratto di servizio che, quando associato insieme al contratto di servizio originale, definisce uno scambio di messaggi che può scorrere in modo indipendente in due modi.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. Per informazioni dettagliate, vedere CallbackContract.For details, see CallbackContract.

Costruttori

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

Inizializza una nuova istanza della classe ServiceContractAttribute.Initializes a new instance of the ServiceContractAttribute class.

Proprietà

CallbackContract CallbackContract CallbackContract CallbackContract

Ottiene o imposta il tipo di contratto di callback quando il contratto è duplex.Gets or sets the type of callback contract when the contract is a duplex contract.

ConfigurationName ConfigurationName ConfigurationName ConfigurationName

Consente di ottenere o impostare il nome usato per individuare il servizio in un file di configurazione dell'applicazione.Gets or sets the name used to locate the service in an application configuration file.

HasProtectionLevel HasProtectionLevel HasProtectionLevel HasProtectionLevel

Ottiene un valore che indica se al membro è stato assegnato un livello di protezione.Gets a value that indicates whether the member has a protection level assigned.

Name Name Name Name

Consente di ottenere o impostare il nome dell'elemento <portType> in WSDL (Web Services Description Language).Gets or sets the name for the <portType> element in Web Services Description Language (WSDL).

Namespace Namespace Namespace Namespace

Consente di ottenere o impostare lo spazio dei nomi dell'elemento <portType> in WSDL (Web Services Description Language).Gets or sets the namespace of the <portType> element in Web Services Description Language (WSDL).

ProtectionLevel ProtectionLevel ProtectionLevel ProtectionLevel

Specifica se l'associazione del contratto deve supportare il valore della proprietà ProtectionLevel.Specifies whether the binding for the contract must support the value of the ProtectionLevel property.

SessionMode SessionMode SessionMode SessionMode

Consente di ottenere o impostare un valore che stabilisce se le sessioni sono consentite, non consentite oppure obbligatorie.Gets or sets whether sessions are allowed, not allowed or required.

TypeId TypeId TypeId TypeId

Quando è implementata in una classe derivata, ottiene un identificatore univoco della classe Attribute.When implemented in a derived class, gets a unique identifier for this Attribute.

(Inherited from Attribute)

Metodi

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

Restituisce un valore che indica se questa istanza è uguale a un oggetto specificato.Returns a value that indicates whether this instance is equal to a specified object.

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

Restituisce il codice hash per l'istanza.Returns the hash code for this instance.

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

Ottiene l'oggetto Type dell'istanza corrente.Gets the Type of the current instance.

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

In caso di override in una classe derivata, indica se il valore di questa istanza è il valore predefinito per la classe derivata.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)

Quando è sottoposto a override in una classe derivata, restituisce un valore che indica se questa istanza equivale a un oggetto specificato.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 superficiale dell'oggetto Object corrente.Creates a shallow copy of the current Object.

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

Restituisce una stringa che rappresenta l'oggetto corrente.Returns a string that represents the current object.

(Inherited from Object)

Implementazioni dell'interfaccia esplicita

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

Esegue il mapping di un set di nomi a un set corrispondente di ID dispatch.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)

Recupera le informazioni sul tipo relative a un oggetto, che possono essere usate per ottenere informazioni sul tipo relative a un'interfaccia.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 il numero delle interfacce di informazioni sul tipo fornite da un oggetto (0 o 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)

Fornisce l'accesso a proprietà e metodi esposti da un oggetto.Provides access to properties and methods exposed by an object.

(Inherited from Attribute)

Si applica a

Vedi anche