WSStreamedHttpBinding
Nell'esempio WSStreamedHttpBinding, viene illustrato come creare un'associazione progettata per supportare scenari basati sul flusso quando viene utilizzato il trasporto HTTP.
Nota
La procedura di installazione e le istruzioni di compilazione per questo esempio si trovano alla fine di questo argomento.
I passaggi per creare e configurare una nuova associazione standard sono i seguenti.
Creazione di una nuova associazione standard
Le associazioni standard di Windows Communication Foundation (WCF), come basicHttpBinding e netTcpBinding configurano i trasporti sottostanti e i stack di canali per i requisiti specifici. In questo esempio,
WSStreamedHttpBinding
configura lo stack di canali per supportare il flusso. Per impostazione predefinita, WS-Security e la messaggistica affidabile non vengono aggiunti allo stack di canali perché entrambi le funzionalità non sono supportate dal flusso. La nuova associazione viene implementata nella classeWSStreamedHttpBinding
che deriva da Binding.WSStreamedHttpBinding
contiene i seguenti elementi di associazione: HttpTransportBindingElement, HttpsTransportBindingElement, TransactionFlowBindingElement e TextMessageEncodingBindingElement. La classe fornisce un metodoCreateBindingElements()
per configurare lo stack dell'associazione risultante, come illustrato nell'esempio di codice seguente.public override BindingElementCollection CreateBindingElements() { // return collection of BindingElements BindingElementCollection bindingElements = new BindingElementCollection(); // the order of binding elements within the collection is important: layered channels are applied in the order included, followed by // the message encoder, and finally the transport at the end if (flowTransactions) { bindingElements.Add(transactionFlow); } bindingElements.Add(textEncoding); // add transport (http or https) bindingElements.Add(transport); return bindingElements.Clone(); }
Aggiunta del supporto di configurazione
Per esporre il trasporto tramite la configurazione l'esempio implementa altre due classi:
WSStreamedHttpBindingConfigurationElement
eWSStreamedHttpBindingSection
. La classeWSStreamedHttpBindingSection
è una classe StandardBindingCollectionElement<TStandardBinding,TBindingConfiguration> che esponeWSStreamedHttpBinding
al sistema di configurazione di WCF. La maggior parte dell'implementazione viene delegata aWSStreamedHttpBindingConfigurationElement
che deriva da StandardBindingElement. La classeWSStreamedHttpBindingConfigurationElement
è dotata delle proprietà che corrispondono alle proprietà diWSStreamedHttpBinding
e funzioni che consentono di eseguire il mapping di ogni elemento di configurazione a un'associazione.Registrare il gestore nel sistema di configurazione, aggiungendo la sezione seguente al file di configurazione del servizio.
<configuration> <system.serviceModel> <extensions> <bindingExtensions> <add name="wsStreamedHttpBinding" type="Microsoft.ServiceModel.Samples.WSStreamedHttpBindingCollectionElement, WSStreamedHttpBinding, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" /> </bindingExtensions> </extensions> </system.serviceModel> </configuration>
È possibile fare riferimento al gestore dalla sezione di configurazione serviceModel.
<configuration> <system.serviceModel> <client> <endpoint address="https://localhost/servicemodelsamples/service.svc" bindingConfiguration="Binding" binding="wsStreamedHttpBinding" contract="Microsoft.ServiceModel.Samples.IStreamedEchoService"/> </client> </system.serviceModel> </configuration>
Per impostare, compilare ed eseguire l'esempio
Installare ASP.NET 4.0 usando il comando seguente.
%windir%\Microsoft.NET\Framework\v4.0.XXXXX\aspnet_regiis.exe /i /enable
Assicurarsi di aver eseguito i passaggi elencati nella Procedura di installazione singola per gli esempi di Windows Communication Foundation.
Assicurarsi di aver eseguito le Istruzioni per l'installazione dei certificati del server Internet Information Services (IIS).
Per compilare la soluzione, seguire le istruzioni in Compilazione degli esempi di Windows Communication Foundation.
Per eseguire l'esempio tra computer diversi, seguire le istruzioni in Esecuzione degli esempi di Windows Communication Foundation.
Quando viene visualizzata la finestra client, digitare "Esempio.txt." Nella directory dovrebbe essere presente una "Copia di Esempio.txt".
Esempio di servizio WSStreamedHttpBinding
L'esempio di servizio che utilizza WSStreamedHttpBinding
si trova nella sottodirectory del servizio. L'implementazione di OperationContract
utilizza un MemoryStream
per recuperare tutti i dati dal flusso in ingresso prima di restituire MemoryStream
. L'esempio di servizio è ospitato da Internet Information Services (IIS).
[ServiceContract]
public interface IStreamedEchoService
{
[OperationContract]
Stream Echo(Stream data);
}
public class StreamedEchoService : IStreamedEchoService
{
public Stream Echo(Stream data)
{
MemoryStream dataStorage = new MemoryStream();
byte[] byteArray = new byte[8192];
int bytesRead = data.Read(byteArray, 0, 8192);
while (bytesRead > 0)
{
dataStorage.Write(byteArray, 0, bytesRead);
bytesRead = data.Read(byteArray, 0, 8192);
}
data.Close();
dataStorage.Seek(0, SeekOrigin.Begin);
return dataStorage;
}
}
Esempio di Client WSStreamedHttpBinding
Il client utilizzato per interagire con il servizio utilizzando WSStreamedHttpBinding
si trova nella sottodirectory client. Poiché il certificato usato in questo esempio è un certificato di prova creato con Makecert.exe, viene visualizzato un avviso di sicurezza quando si tenta di accedere a un indirizzo HTTPS, quale https://localhost/servicemodelsamples/service.svc
, dal browser. Per consentire al client WCF di lavorare con un certificato di prova, è stato aggiunto altro codice al client per sopprimere l'avviso di sicurezza. Il codice e la classe associata non sono richiesti quando si utilizzano i certificati di produzione.
// WARNING: This code is only required for test certificates such as those created by makecert. It is
// not recommended for production code.
PermissiveCertificatePolicy.Enact("CN=ServiceModelSamples-HTTPS-Server");