WCF udostępnia następujące metody:
- żądanie-odpowiedź,
- jednokierunkowe,
- zwrotne,
- strumieniowe przesyłanie danych.
Operacje żądanie-odpowiedź
Operacja jest domyślnym rodzajem metody usługi. Po wywołaniu metody przez klienta oczekuje on na odpowiedź. W przypadku przekroczenia czasu klient otrzymuje wyjątek TimeoutException. Operacja nie jest obsługiwana przez NetPeerTcpBinding i NetMsmqBinding.
Operacje jednokierunkowe
Po wywołaniu metody przez klienta, generowane jest żądanie przez środowisko WCF, ale nie zwraca klientowi żadnej odpowiedzi. Ten typ operacji ustawia się przez ustawienie atrybutu OperationContract(IsOneWay=true) dla metody, która nie zwraca żadnej wartości (w przeciwnym razie zostanie rzucony wyjątek InvalidOperationException.
[ServiceContract(SessionMode=SessionMode.Required)]
public interface ISessionResearchService
{
[OperationContract]
string Login(string password);
[OperationContract(IsInitiating = false)]
void InsertData(string token, int data);
[OperationContract(IsInitiating = false)]
List<int> ReadData(string token);
[OperationContract(IsInitiating = false, IsOneWay = true, IsTerminating = true)]
void Logout(string token);
}
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
public class SessionResearchService : ISessionResearchService
{
//...
}
Strumieniowe przesyłanie danych
WCF umożliwia przesyłanie strumieni przez klasę bazową Stream. Domyślnie wymieniane komunikaty są buforowane, czyli przed przekazaniem do odbiorcy musi nastąpić ich pełne otrzymanie. Technologia WCF umożlwia rozpoczęcie przetwarzania danych z komunikatu przed pełnym jego otrzymaniem przez zmianę trybu przesyłania danych (TransferMode).
Ten rodzaj operacji jest możliwy przez powiązania TCP, IPC i podstawowe powiązanie HTTP.
Przy użyciu tego radzaju operacji nie jest możliwe używanie zabezpieczeń transportowych na poziomie komunikatów.
[ServiceContract]
public interface IStreamService
{
[OperationContract]
Stream Download();
}
app.config
<?xml version="1.0"?>
<configuration>
<system.serviceModel>
<services>
<service behaviorConfiguration="ServiceBehavior" name="kq.Research.WCF.StreamService">
<endpoint address="" binding="basicHttpBinding" bindingConfiguration="StreamedHTTP" contract="kq.Research.WCF.IStreamService">
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
<endpoint address="net.tcp://localhost:8090/StreamService" binding="netTcpBinding" bindingConfiguration="StreamedTCP" contract="kq.Research.WCF.IStreamService"/>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
<host>
<baseAddresses>
<add baseAddress="http://localhost:8731/StreamService"/>
<add baseAddress="net.tcp://localhost:8090/StreamService"/>
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="ServiceBehavior">
<serviceMetadata httpGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="False"/>
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<basicHttpBinding>
<binding name="StreamedHTTP" transferMode="Streamed" />
</basicHttpBinding>
<netTcpBinding>
<binding name="StreamedTCP" transferMode="Streamed" />
</netTcpBinding>
</bindings>
</system.serviceModel>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>
</configuration>