WSStreamedHttpBinding
The sample demonstrates how to create a binding that is designed to support streaming scenarios when the HTTP transport is used.
Note
The setup procedure and build instructions for this sample are located at the end of this topic.
The steps to create and configure a new standard binding are as follows.
Create a new standard binding
The standard bindings in Windows Communication Foundation (WCF) such as basicHttpBinding, and netTcpBinding configure the underlying transports and channel stack for specific requirements. In this sample,
WSStreamedHttpBinding
configures the channel stack to support streaming. By default, WS-Security and reliable messaging are not added to the channel stack because both features are not supported by streaming. The new binding is implemented in the classWSStreamedHttpBinding
that derives from Binding. TheWSStreamedHttpBinding
contains the following binding elements: HttpTransportBindingElement, HttpsTransportBindingElement, TransactionFlowBindingElement, and TextMessageEncodingBindingElement. The class provides aCreateBindingElements()
method to configure the resulting binding stack, as shown in the following sample code.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(); }
Add configuration support
To expose the transport through configuration the sample implements two more classes—
WSStreamedHttpBindingConfigurationElement
andWSStreamedHttpBindingSection
. The classWSStreamedHttpBindingSection
is a StandardBindingCollectionElement that exposesWSStreamedHttpBinding
to the WCF configuration system. The bulk of the implementation is delegated toWSStreamedHttpBindingConfigurationElement
, which derives from StandardBindingElement. The classWSStreamedHttpBindingConfigurationElement
has properties that correspond to the properties ofWSStreamedHttpBinding
, and functions to map each configuration element to a binding.Register the handler with the configuration system, by adding the following section to the service's configuration file.
<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>
The handler can then be referenced from the serviceModel configuration section.
<configuration> <system.serviceModel> <client> <endpoint address="https://localhost/servicemodelsamples/service.svc" bindingConfiguration="Binding" binding="wsStreamedHttpBinding" contract="Microsoft.ServiceModel.Samples.IStreamedEchoService"/> </client> </system.serviceModel> </configuration>
To set up, build, and run the sample
Ensure that you have performed the steps listed in One-Time Set Up Procedure for the Windows Communication Foundation Samples.
Ensure that you have performed the Internet Information Service (IIS) Server Certificate Installation Instructions.
To build the solution, follow the instructions in Building the Windows Communication Foundation Samples.
To run the sample in a cross-machine configuration, follow the instructions in Running the Windows Communication Foundation Samples.
When the client window displays, type "Sample.txt". You should find a "Copy of Sample.txt" in your directory.
The WSStreamedHttpBinding Sample Service
The sample service that uses WSStreamedHttpBinding
is located in the service subdirectory. The implementation of OperationContract
uses a MemoryStream
to first retrieve all data from the incoming stream before returning the MemoryStream
. The sample service is hosted by 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;
}
}
The WSStreamedHttpBinding Sample Client
The client that is used to interact with the service using WSStreamedHttpBinding
is located in the client subdirectory. Because the certificate used in this sample is a test certificate created with Makecert.exe, a security alert displays when you attempt to access an HTTPS address in your browser such as https://localhost/servicemodelsamples/service.svc. To allow the WCF client to work with a test certificate in place, some additional code has been added to the client to suppress the security alert. The code and the accompanying class are not required when using production certificates.
// 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");
© 2007 Microsoft Corporation. All rights reserved.