WSStreamedHttpBinding

O exemplo WSStreamedHttpBinding demonstra como criar uma associação projetada para dar suporte a cenários de streaming quando o transporte HTTP é usado.

Observação

O procedimento de instalação e as instruções de build para este exemplo estão localizados no final deste tópico.

As etapas para criar e configurar uma nova associação padrão são as seguintes.

  1. Criar uma nova associação padrão

    As associações padrão no WCF (Windows Communication Foundation), como basicHttpBinding e netTcpBinding, configuram os transportes subjacentes e a pilha de canais para requisitos específicos. Neste exemplo, WSStreamedHttpBinding configura a pilha de canais para dar suporte ao streaming. Por padrão, WS-Security e mensagens confiáveis não são adicionados à pilha de canais porque nenhum dos dois recursos têm suporte por streaming. A nova associação é implementada na classe WSStreamedHttpBinding que deriva de Binding. Contém WSStreamedHttpBinding os seguintes elementos de associação: HttpTransportBindingElement, HttpsTransportBindingElement, TransactionFlowBindingElemente TextMessageEncodingBindingElement. A classe fornece um CreateBindingElements() método para configurar a pilha de associação resultante, conforme mostrado no código de exemplo a seguir.

    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. Adicionar suporte à configuração

    Para expor o transporte por meio da configuração, o exemplo implementa mais duas classes: WSStreamedHttpBindingConfigurationElement e WSStreamedHttpBindingSection. A classe WSStreamedHttpBindingSection é uma StandardBindingCollectionElement<TStandardBinding,TBindingConfiguration> que expõe WSStreamedHttpBinding ao sistema de configuração do WCF. A maior parte da implementação é delegada para WSStreamedHttpBindingConfigurationElement, que deriva de StandardBindingElement. A classe WSStreamedHttpBindingConfigurationElement tem propriedades que correspondem às propriedades de WSStreamedHttpBinding, e funções para mapear cada elemento de configuração para uma associação.

    Registre o manipulador com o sistema de configuração adicionando a seção a seguir ao arquivo de configuração do serviço.

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

    O manipulador pode então ser referenciado na seção de configuração 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 e executar o exemplo

  1. Instale ASP.NET 4.0 usando o comando a seguir.

    %windir%\Microsoft.NET\Framework\v4.0.XXXXX\aspnet_regiis.exe /i /enable
    
  2. Verifique se você executou as etapas listadas em One-Time Procedimento de Instalação para os Exemplos do Windows Communication Foundation.

  3. Verifique se você executou as instruções de instalação do certificado do servidor do IIS (Serviços de Informações da Internet).

  4. Para criar a solução, siga as instruções na criação dos exemplos do Windows Communication Foundation.

  5. Para executar o exemplo em uma configuração entre máquinas, siga as instruções em Executar os exemplos do Windows Communication Foundation.

  6. Quando a janela do cliente for exibida, digite "Sample.txt". Você deve encontrar uma "Copy of Sample.txt" em seu diretório.

Serviço de amostra WSStreamedHttpBinding

O serviço de exemplo que usa WSStreamedHttpBinding está localizado no subdiretório de serviço. A implementação de OperationContract usa MemoryStream para primeiro recuperar todos os dados do fluxo de entrada antes de retornar o MemoryStream. O serviço de exemplo é hospedado pelo IIS (Serviços de Informações da Internet).

[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 amostra WSStreamedHttpBinding

O cliente usado para interagir com o serviço usando WSStreamedHttpBinding está localizado no subdiretório do cliente. Como o certificado usado neste exemplo é um certificado de teste criado com Makecert.exe, um alerta de segurança é exibido quando você tenta acessar um endereço HTTPS em seu navegador, como https://localhost/servicemodelsamples/service.svc. Para permitir que o cliente WCF trabalhe com um certificado de teste em vigor, alguns códigos adicionais foram adicionados ao cliente para suprimir o alerta de segurança. O código e a classe associada não são necessários quando se usam certificados de produção.

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