WSStreamedHttpBinding

El ejemplo WSStreamedHttpBinding muestra cómo crear un enlace diseñado para admitir escenarios de streaming cuando se usa el transporte HTTP.

Nota:

El procedimiento de instalación y las instrucciones de compilación de este ejemplo se encuentran al final de este tema.

Los pasos para crear y configurar un nuevo enlace estándar son los siguientes.

  1. Creación de un nuevo enlace estándar

    Los enlaces estándar de Windows Communication Foundation (WCF), como basicHttpBinding y netTcpBinding, configuran los transportes subyacentes y la pila de canales para requisitos específicos. En este ejemplo, WSStreamedHttpBinding configura la pila de canales para admitir el streaming. De forma predeterminada, WS-Security y mensajería confiable no se agregan a la pila de canales porque ambas características no son compatibles con el streaming. El nuevo enlace se implementa en la clase WSStreamedHttpBinding que deriva de Binding. WSStreamedHttpBinding contiene los siguientes elementos de enlace: HttpTransportBindingElement, HttpsTransportBindingElement, TransactionFlowBindingElementy TextMessageEncodingBindingElement. La clase proporciona un CreateBindingElements() método para configurar la pila de enlace resultante, como se muestra en el código de ejemplo siguiente.

    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();
    }
    
  2. Añadir soporte de configuración

    Para exponer el transporte a través de la configuración, el ejemplo implementa dos clases más:WSStreamedHttpBindingConfigurationElement y WSStreamedHttpBindingSection. La clase WSStreamedHttpBindingSection es un StandardBindingCollectionElement<TStandardBinding,TBindingConfiguration> que expone WSStreamedHttpBinding al sistema de configuración de WCF. La mayor parte de la implementación se delega en WSStreamedHttpBindingConfigurationElement, que deriva de StandardBindingElement. La clase WSStreamedHttpBindingConfigurationElement tiene propiedades que corresponden a las propiedades de WSStreamedHttpBinding y funciones para mapear cada elemento de configuración a un enlace.

    Registre el controlador con el sistema de configuración agregando la siguiente sección al archivo de configuración del servicio.

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

    A continuación, se puede hacer referencia al controlador desde la sección de configuración 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>
    

Para configurar, compilar y ejecutar el ejemplo

  1. Instale ASP.NET 4.0 con el comando siguiente.

    %windir%\Microsoft.NET\Framework\v4.0.XXXXX\aspnet_regiis.exe /i /enable
    
  2. Asegúrese de que ha realizado los pasos enumerados del procedimiento de configuración única de los ejemplos de Windows Communication Foundation.

  3. Asegúrese de que ha realizado las instrucciones de instalación de certificados de servidor de Internet Information Services (IIS).

  4. Para compilar la solución, siga las instrucciones de Creación de ejemplos de Windows Communication Foundation.

  5. Para ejecutar el ejemplo en una configuración entre máquinas, siga las instrucciones de Ejecución de los ejemplos de Windows Communication Foundation.

  6. Cuando se muestre la ventana del cliente, escriba "Sample.txt". Debería encontrar una "Copy of Sample.txt" en su directorio.

Servicio de muestra WSStreamedHttpBinding

El servicio de ejemplo que usa WSStreamedHttpBinding se encuentra en el subdirectorio de servicio. La implementación de OperationContract utiliza un MemoryStream para recuperar primero todos los datos de la secuencia entrante antes de devolver el MemoryStream. El servicio de ejemplo se hospeda en 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;
    }
}

Cliente de muestra WSStreamedHttpBinding

El cliente que se usa para interactuar con el servicio mediante WSStreamedHttpBinding se encuentra en el subdirectorio de cliente. Dado que el certificado usado en este ejemplo es un certificado de prueba creado con Makecert.exe, se muestra una alerta de seguridad al intentar acceder a una dirección HTTPS en el explorador, como https://localhost/servicemodelsamples/service.svc. Para permitir que el cliente WCF funcione con un certificado de prueba, se ha agregado código adicional al cliente para suprimir la alerta de seguridad. El código y la clase que lo acompaña no son necesarios al usar certificados de producción.

// 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");