C# Language
Windows Communication Foundation
Ricerca…
introduzione
Windows Communication Foundation (WCF) è un framework per la creazione di applicazioni orientate ai servizi. Utilizzando WCF, è possibile inviare dati come messaggi asincroni da un endpoint di un servizio a un altro. Un endpoint del servizio può essere parte di un servizio continuamente disponibile ospitato da IIS o può essere un servizio ospitato in un'applicazione. I messaggi possono essere semplici come un singolo carattere o una parola inviata come XML o complessa come un flusso di dati binari.
Iniziare campione
Il servizio descrive le operazioni che esegue in un contratto di servizio che espone pubblicamente come metadati.
// Define a service contract.
[ServiceContract(Namespace="http://StackOverflow.ServiceModel.Samples")]
public interface ICalculator
{
[OperationContract]
double Add(double n1, double n2);
}
L'implementazione del servizio calcola e restituisce il risultato appropriato, come mostrato nel seguente codice di esempio.
// Service class that implements the service contract.
public class CalculatorService : ICalculator
{
public double Add(double n1, double n2)
{
return n1 + n2;
}
}
Il servizio espone un endpoint per la comunicazione con il servizio, definito utilizzando un file di configurazione (Web.config), come mostrato nella seguente configurazione di esempio.
<services>
<service
name="StackOverflow.ServiceModel.Samples.CalculatorService"
behaviorConfiguration="CalculatorServiceBehavior">
<!-- ICalculator is exposed at the base address provided by
host: http://localhost/servicemodelsamples/service.svc. -->
<endpoint address=""
binding="wsHttpBinding"
contract="StackOverflow.ServiceModel.Samples.ICalculator" />
...
</service>
</services>
Il framework non espone i metadati per impostazione predefinita. In quanto tale, il servizio attiva ServiceMetadataBehavior ed espone un endpoint MEX (metadata exchange) su http: //localhost/servicemodelsamples/service.svc/mex . La seguente configurazione lo dimostra.
<system.serviceModel>
<services>
<service
name="StackOverflow.ServiceModel.Samples.CalculatorService"
behaviorConfiguration="CalculatorServiceBehavior">
...
<!-- the mex endpoint is explosed at
http://localhost/servicemodelsamples/service.svc/mex -->
<endpoint address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange" />
</service>
</services>
<!--For debugging purposes set the includeExceptionDetailInFaults
attribute to true-->
<behaviors>
<serviceBehaviors>
<behavior name="CalculatorServiceBehavior">
<serviceMetadata httpGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="False" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
Il client comunica utilizzando un determinato tipo di contratto utilizzando una classe client generata da ServiceModel Metadata Utility Tool (Svcutil.exe).
Eseguire il seguente comando dal prompt dei comandi SDK nella directory del client per generare il proxy digitato:
svcutil.exe /n:"http://StackOverflow.ServiceModel.Samples,StackOverflow.ServiceModel.Samples" http://localhost/servicemodelsamples/service.svc/mex /out:generatedClient.cs
Come il servizio, il client utilizza un file di configurazione (App.config) per specificare l'endpoint con il quale desidera comunicare. La configurazione dell'endpoint del client è costituita da un indirizzo assoluto per l'endpoint del servizio, l'associazione e il contratto, come illustrato nell'esempio seguente.
<client>
<endpoint
address="http://localhost/servicemodelsamples/service.svc"
binding="wsHttpBinding"
contract="StackOverflow.ServiceModel.Samples.ICalculator" />
</client>
L'implementazione client crea un'istanza del client e utilizza l'interfaccia tipizzata per iniziare a comunicare con il servizio, come mostrato nel seguente codice di esempio.
// Create a client.
CalculatorClient client = new CalculatorClient();
// Call the Add service operation.
double value1 = 100.00D;
double value2 = 15.99D;
double result = client.Add(value1, value2);
Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result);
//Closing the client releases all communication resources.
client.Close();