Este artigo foi traduzido por máquina. Para visualizar o arquivo em inglês, marque a caixa de seleção Inglês. Você também pode exibir o texto Em inglês em uma janela pop-up, movendo o ponteiro do mouse sobre o texto.
Tradução
Inglês
Esta documentação foi arquivada e não está sendo atualizada.

Modificação de mensagem SOAP usando extensões SOAP

.NET Framework 2.0

As extensões SOAP permitem que os desenvolvedores aumentem a funcionalidade de um serviço da Web alterando as mensagens SOAP enviadas para e de um serviço da Web ou um cliente do serviço da Web.Por exemplo, você pode implementar um algoritmo de criptografia ou compactação que seja executado com um serviço da Web existente.

Para compreender como funciona uma extensão SOAP,  é útil compreender primeiro o tempo de vida de um serviço da Web.Para obter mais informações, consulte Anatomia de um tempo de serviço da Web XML.

A ilustração que segue, mostra as fases princiapais para chamar um Web Service.

Anatomia de uma vida útil de serviço da Web

Vida útil do serviço XML da Web

As you can see, the .NET Framework serializes and deserializes XML During phases on Ambos the computador serviço da Web and the computador cliente de serviços da Web.A extensão SOAP can be injected into the Infrastructure to inspecionar or modify the SOAP Mensagens before and after each of these phases serializar and desserializar.For instância, an criptografia extensão SOAP Might criptografar the parte de XML of the mensagem SOAP after the .NET Framework serializes 's the cliente Arguments, and then Decrypt the mensagem SOAP on the Servidor Web before the .NET Framework deserializes the mensagem SOAP.These phases, onde a extensão SOAP Might inspecionar or modify the mensagem SOAP, are defined in the enumeração SoapMessageStage.In this maiúscminúsc, the extensão SOAP is Encrypting in the Stage AfterSerialize and Decrypting in the Stage BeforeDeserialize.

Normalmente, quando modifica um extensão SOAP o conteúdo de um mensagem SOAP, as modificações devem ser feitas em tanto o cliente quanto o servidor.Isto é, se fosse um extensão SOAP para executar na Cliente e criptografar o mensagem SOAP, um correspondente extensão SOAP deve descriptografar a mensagem SOAP sobre o servidor.Se a mensagem SOAP não for descriptografada, em seguida, a infra-estrutura do ASP.NET não é possível desserializar a mensagem SOAP em um objeto.

Of Course, um extensão SOAP que não Modificar o mensagem SOAP, such as um extensão SOAP que simplesmente registra as mensagens SOAP, pode executar apenas do cliente ou servidor.In this maiúsculas e minúsculas, the Recipient receives the same mensagem SOAP IT would have if a SOAP Extensão were not execução and the Infrastructure ASP.NET can desserializar the mensagem SOAP.Also, If the extensão SOAP does not modify the SOAP in a way that makes desserialização Impossible, the extensão SOAP does not need to executar on Ambos the cliente and servidor.

Para implementar uma extensão SOAP, derive uma classe da classe SoapExtension.existem três métodos da classe SOAPExtension que devem, ou não, ser implementados:

Como implementar esses métodos é explicado no tópico passo a passo Walkthrough: Alterar a mensagem SOAP usando extensões SOAP.

O método ChainStream é passado um objeto Stream e retorna um objeto Stream.À medida que a extensão SOAP é executada durante cada SoapMessageStage e modifica a mensagem SOAP, uma extensão SOAP deve ler a partir de Stream passada para ChainStream e gravar o Stream retornado de ChainStream.Therefore, it is important within the ChainStreammethod to assign both Stream references to member variables.

A classe derivação de SoapExtension usa o GetInitializer e Initialize métodos para inicializar dados internos, com base no serviço da Web ou ela é aplicada a método de serviço da Web.For instância, a extensão SOAP that logs the mensagem SOAP Sent to and de a método serviço da Web Might inicializar the name of a arquivo to salvar the informações log (based on the name of the serviço da Web or the método serviço da Web is the extensão SOAP execução with).

Em que ponto as chamadas de infra-estrutura serviços da Web o método GetInitializer e quais parâmetros são passados para o método dependem como a extensão SOAP é configurada, da seguinte forma:

  • Se o extensão SOAP é configurada usando um atributo, GetInitializer é chamado da Serviços tempo infra-estrutura primeiro um serviço da Web method é acessado.

  • Se a extensão SOAP estiver configurado em um arquivo de configuração, GetInitializer é chamado pelo tempo de infra-estrutura somente o primeiro serviços da Web que todo o serviço da Web é acessado.

A infra-estrutura de serviços da Web armazena em cache o objeto que retorna o método GetInitializer.Em seguida, sempre que a extensão SOAP é executada com esse serviço da Web ou método de serviço da Web, a infra-estrutura passa o objeto inicializador para o método Initialize.

Processamento estendido real além de processamento SOAP padrão é executado pelo método ProcessMessage.Sempre que a infra-estrutura de serviços da Web chama ProcessMessage, ele passa (como um argumento) uma instância de uma classe derivada SoapMessage que contém informações sobre a mensagem SOAP que estágio específico.Se for o extensão SOAP Executando com um serviço da Web, em seguida, um objeto SoapServerMessage é passado.Se for o extensão SOAP Executando com um cliente de serviços da Web, em seguida, um objeto SoapClientMessage é passado.

As extensões SOAP e exceções

As extensões SOAP nunca devem acionar exceções próprios.No entanto, eles podem, adicionar informações de exceção para a propriedade do objeto passado o método ExceptionSoapMessageProcessMessage(SoapMessage).

Eles também podem servir como manipulador de exceção Application-Wide usando a mesma instalações para capturar todas as exceções no aplicativo para o qual a extensão SOAP é instalado e executar alguns comportamento incluindo modificando o falha de SOAP retornado.

Agora que você procuraram nos métodos que substitui uma extensão SOAP, examine quando a infra-estrutura de serviços da Web chama métodos de extensão SOAP em toda a invocação de um método de serviço da Web.The seguinte assume Steps that is the extensão SOAP execução on Ambos the cliente and servidor.If the extensão SOAP is not execução on Ambos the cliente and the servidor, the associado steps with the extensão SOAP execução on each are ignored by the .NET Framework.

A Message Request Prepares Cliente side

  1. Um cliente chama um método na classe de proxy.

  2. Is a new instância of the extensão SOAP Criado on the cliente.

  3. If this is the Primeiro tempo this extensão SOAP has executado With this serviço da Web on the cliente, then the método GetInitializer is invoked on the extensão SOAP execução on the cliente.

  4. O método Initialize é invocado.

  5. O método ChainStream é invocado.

  6. O método ProcessMessage é chamado com SoapMessageStage definido para BeforeSerialize.

  7. O ASP.NET no computador do cliente serializa os argumentos do método de serviço da Web em XML.

  8. O método ProcessMessage é chamado com SoapMessageStage definido para AfterSerialize.

  9. ASP.NET na computador cliente envia o mensagem SOAP através de rede para o Servidor Web que hospeda o serviço da Web.

Receives a Message Request Servidor side and Prepares a Response

  1. O ASP.NET no servidor Web recebe a mensagem SOAP.

  2. Is a new of the Criado on the .

  3. On the Web server, if this is the first time this SOAP extension has executed with this Web service on the server side, the GetInitializermethod is invoked on the SOAP extension running on the server.

  4. O método Initialize é invocado.

  5. O método ChainStream é invocado.

  6. O método ProcessMessage é chamado com SoapMessageStage definido para BeforeDeserialize.

  7. O ASP.NET desserializa os argumentos dentro do XML.

  8. O método ProcessMessage é chamado com SoapMessageStage definido para AfterDeserialize.

  9. ASP.NET creates a Novo instância of the classe Implementing the serviço da Web and the método serviço da Web, passing in the Arguments deserialized invokes.This objeto resides on the same computador as the Servidor Web.

  10. The método serviço da Web executes its Código, eventually configuração the valor de retorno and any out Parameters.

  11. O método ProcessMessage é chamado com SoapMessageStage definido para BeforeSerialize.

  12. ASP.NET na servidor Web serializa os valor de retorno e sem parâmetros em XML.

  13. O método ProcessMessage é chamado com SoapMessageStage definido para AfterSerialize.

  14. ASP.NET SENDs the mensagem de resposta SOAP over the rede Voltar to the cliente de serviços da Web.

Lado do cliente recebe uma mensagem de resposta

  1. O ASP.NET no computador do cliente recebe a mensagem SOAP.

  2. O método ProcessMessage é chamado com SoapMessageStage definido para BeforeDeserialize.

  3. O ASP.NET desserializa o XML para o valor de retorno e qualquer sem parâmetros.

  4. O método ProcessMessage é chamado com SoapMessageStage definido para AfterDeserialize.

  5. O ASP.NET passa o valor de retorno e qualquer sem parâmetros para a instância da classe de proxy.

  6. O cliente recebe o valor de retorno e qualquer sem parâmetros.

Há duas maneiras para executar uma extensão SOAP em um aplicativo cliente ou servidor.Primeiro, você pode configurar o aplicativo para executar a extensão.Para configurar o extensão SOAP para executar para todos os métodos da Web em todos os Web Serviços, especialmente uma VRoot, editar a seção < soapExtensionTypes > Elemento dentro o arquivo web.config.The seguinte Código shows that the valor atributo type must be on one line and the nome totalmente qualificado of the extensão, Plus the versão, cultura, and símbolo de chave pública of the assinado include assembly.

<configuration>
 <system.web>
    <webServices>
      <soapExtensionTypes>
        <add type="Contoso.MySoapExtension, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" 
priority="1" group="0"/>
        </soapExtensionTypes>
    </webServices>
  </system.web>
</configuration>

Em segundo lugar, você pode criar um Personalizar atributo que é aplicado a um método serviço da Web.To Criar the atributo personalizado, Criar a classe that derives from SoapExtensionAttribute.For Details Sobre Creating a atributo personalizado, see Como: Implementar uma extensão SOAP.For more Sobre Creating Attributes, see Creating Custom Attributes.

ObservaçãoObservação:

Ao implementar uma extensão SOAP, há a possibilidade de que um ataque DoS (negação de serviço) poderia ser tentada se sua extensão usa um XmlTextReader para ler o fluxo de dados.Uma maneira de evitar tal ataque é garantir que a propriedade ProhibitDtd é definida como true.

As prioridades e grupos prioridade

Using Either Attributes OR , Extensions can be Assigned a that helps determine the of Execution When extensions are configured to with an XML Web Serviço .Quanto maior a prioridade é uma extensão SOAP, o mais próximo ele executa para a mensagem SOAP que estão sendo enviados ou recebidos pela rede.As extensões SOAP pertencem a qualquer um dos três grupos de prioridade.WITHIN each Agrupar, the priority distinguishes each.Quanto menor a propriedade priority é, a maior de Relativo prioridade (0 seja o mais alto).

As três Relativo prioridade grupos para extensões SOAP são: As extensões SOAP configuradas usando um atributo e as extensões SOAP especificadas no arquivo de configuração com uma configuração de group01.Suas prioridades são ordenadas da seguinte maneira:

  • Mais alto GRUPO prioridade: As extensões SOAP configuradas usando um arquivo de configuração com uma configuração de group0.

  • Prioridade Medium Agrupar: As extensões SOAP configuradas com um atributo.

  • Prioridade lowest Agrupar: As extensões SOAP configuradas usando um arquivo de configuração com uma configuração de group1.

The seguinte exemplo de código is a arquivo de configuração that specifies that the Logger.LoggerExtension extensão SOAP Runs within the relativo prioridade Agrupar 0 and has a prioridade of 1.

<configuration>
 <system.web>
   <webServices>
     <soapExtensionTypes>
      <add type="Logger.LoggerExtension,logger"
           priority="1"
           group="0" />
     </soapExtensionTypes>
    </webServices>
 </system.web>
</configuration>
Mostrar: