Guia de início rápido de solução de problemas do WCF

Este tópico lista uma série de problemas conhecidos que os clientes enfrentaram durante o desenvolvimento de clientes e serviços WCF. Se o problema que você está enfrentando não estiver nessa lista, recomendamos que você configure o rastreamento para seu serviço. Isso gerará um arquivo de rastreamento que você pode visualizar com o visualizador de arquivos de rastreamento e obter informações detalhadas sobre exceções que podem estar ocorrendo dentro do serviço. Para obter mais informações sobre como configurar o rastreamento, consulte: Configurando o rastreamento. Para obter mais informações sobre o visualizador de arquivos de rastreamento, consulte: Service Trace Viewer Tool (SvcTraceViewer.exe).

  1. Depois de instalar o Windows 7 e IIS, quando tento navegar para um serviço WCF, recebo a seguinte mensagem de erro: Erro HTTP 404.3 – Não encontrado

    Erro HTTP 404.3 – Não encontradoA página que você está solicitando não pode ser servida devido à configuração da extensão. Se a página for um script, adicione um manipulador. Se o arquivo deve ser baixado, adicione um mapa MIME. Informações detalhadas sobre o erroModule StaticFileModule.

  2. Às vezes, recebo um MessageSecurityException na segunda solicitação se meu cliente estiver ocioso por um tempo após a primeira solicitação. O que é que está a acontecer?

  3. Meu serviço começa a rejeitar novos clientes depois que cerca de 10 clientes estão interagindo com ele. O que é que está a acontecer?

  4. Posso carregar minha configuração de serviço de algum lugar diferente do arquivo de configuração do aplicativo WCF?

  5. Meu serviço e cliente funcionam muito bem, mas não consigo fazê-los funcionar quando o cliente está em outro computador? O que está a acontecer?

  6. Quando lanço uma exceção> FaultException<em que o tipo é uma exceção, sempre recebo um tipo FaultException geral no cliente e não o tipo genérico. O que está a acontecer?

  7. Parece que as operações unidirecionais e de solicitação-resposta retornam aproximadamente na mesma velocidade quando a resposta não contém dados. O que aconteceu?

  8. Estou a utilizar um certificado X.509 com o meu serviço e obtenho um System.Security.Cryptography.CryptographicException. O que está a acontecer?

  9. Mudei o primeiro parâmetro de uma operação de maiúsculas para minúsculas; agora meu cliente lança uma exceção. O que aconteceu?

  10. Estou usando uma das minhas ferramentas de rastreamento e recebo um EndpointNotFoundException. O que está a acontecer?

  11. Ao chamar um aplicativo WCF Web HTTP de um aplicativo WCF SOAP, o serviço retorna o seguinte erro: Método 405 não permitido

Qual é o endereço base? Como ele se relaciona com um endereço de ponto final?

Depois de instalar o Windows 7 e IIS, quando tento navegar para um serviço WCF, recebo a seguinte mensagem de erro: Erro HTTP 404.3 – Não encontrado

A mensagem de erro completa é:

Erro HTTP 404.3 – Não encontradoA página que você está solicitando não pode ser servida devido à configuração da extensão. Se a página for um script, adicione um manipulador. Se o arquivo deve ser baixado, adicione um mapa MIME. Informações detalhadas sobre o erroModule StaticFileModule.

Esta mensagem de erro ocorre quando "Windows Communication Foundation HTTP Activation" não está explicitamente definido no painel de controlo. Para definir isso, vá para o Painel de Controle, clique em Programas no canto inferior esquerdo da janela. Clique em Ativar ou desativar recursos do Windows. Expanda Microsoft .NET Framework 3.5.1 e selecione Ativação HTTP do Windows Communication Foundation.

Às vezes, recebo um MessageSecurityException na segunda solicitação se meu cliente estiver ocioso por um tempo após a primeira solicitação. O que é que está a acontecer?

A segunda solicitação pode falhar principalmente por dois motivos: (1) a sessão expirou ou (2) o servidor Web que está hospedando o serviço foi reciclado. No primeiro caso, a sessão é válida até o tempo limite do serviço. Quando o serviço não recebe uma solicitação do cliente dentro do período de tempo especificado na vinculação do serviço (ReceiveTimeout), o serviço encerra a sessão de segurança. As mensagens subsequentes do MessageSecurityExceptioncliente resultam no arquivo . O cliente deve restabelecer uma sessão segura com o serviço para enviar mensagens futuras ou usar um token de contexto de segurança com monitoração de estado. Os tokens de contexto de segurança com estado também permitem que uma sessão segura sobreviva a um servidor Web que está sendo reciclado. Para obter mais informações sobre como usar tokens de contexto seguro com monitoração de estado em uma sessão segura, consulte Como criar um token de contexto de segurança para uma sessão segura. Como alternativa, você pode desativar sessões seguras. Ao usar a <associação wsHttpBinding>, você pode definir a establishSecurityContext propriedade para false desabilitar sessões seguras. Para desabilitar sessões seguras para outras associações, você deve criar uma associação personalizada. Para obter detalhes sobre como criar uma associação personalizada, consulte Como criar uma associação personalizada usando o SecurityBindingElement. Antes de aplicar qualquer uma dessas opções, você deve entender os requisitos de segurança do seu aplicativo.

Meu serviço começa a rejeitar novos clientes depois que cerca de 10 clientes estão interagindo com ele. O que é que está a acontecer?

Por padrão, os serviços podem ter apenas 10 sessões simultâneas. Portanto, se as ligações de serviço usam sessões, o serviço aceita novas conexões de cliente até atingir esse número, após o que ele recusa novas conexões de cliente até que uma das sessões atuais termine. Você pode oferecer suporte a mais clientes de várias maneiras. Se o seu serviço não exigir sessões, não use uma associação de sessão. (Para obter mais informações, consulte Usando sessões.) Outra opção é aumentar o limite de sessão alterando o MaxConcurrentSessions valor da propriedade para o número adequado à sua circunstância.

Posso carregar minha configuração de serviço de algum lugar diferente do arquivo de configuração do aplicativo WCF?

Sim, no entanto, você precisa criar uma classe personalizada ServiceHost que substitui o ApplyConfiguration método. Dentro desse método, você pode chamar a base para carregar a configuração primeiro (se quiser carregar as informações de configuração padrão também), mas também pode substituir totalmente o sistema de carregamento de configuração. Se desejar carregar a configuração de um arquivo de configuração diferente do arquivo de configuração do aplicativo, você mesmo deverá analisar o arquivo de configuração e carregá-la.

O exemplo de código a seguir mostra como substituir o ApplyConfiguration método e configurar diretamente um ponto de extremidade.

public class MyServiceHost : ServiceHost  
{  
    public MyServiceHost(Type serviceType, params Uri[] baseAddresses)
      : base(serviceType, baseAddresses)  
    {
        Console.WriteLine("MyServiceHost Constructor");
    }  
  
    protected override void ApplyConfiguration()  
    {  
        string straddress = GetAddress();  
        Uri address = new Uri(straddress);  
        Binding binding = GetBinding();  
        base.AddServiceEndpoint(typeof(IData), binding, address);  
    }  
  
    string GetAddress()  
    {
        return "http://MyMachine:7777/MyEndpointAddress/";
    }  
  
    Binding GetBinding()  
    {  
        WSHttpBinding binding = new WSHttpBinding();  
        binding.Security.Mode = SecurityMode.None;  
        return binding;  
    }  
}  

Meu serviço e cliente funcionam muito bem, mas não consigo fazê-los funcionar quando o cliente está em outro computador? O que está a acontecer?

Dependendo da exceção, pode haver vários problemas:

  • Talvez seja necessário alterar os endereços de ponto de extremidade do cliente para o nome do host e não para "localhost".

  • Talvez seja necessário abrir a porta para o aplicativo. Para obter detalhes, consulte Instruções de firewall dos exemplos do SDK.

  • Para outros problemas possíveis, consulte o tópico de exemplos Executando os exemplos do Windows Communication Foundation.

  • Se o cliente estiver usando credenciais do Windows e a exceção for um SecurityNegotiationException, configure o Kerberos da seguinte maneira.

    1. Adicione as credenciais de identidade ao elemento endpoint no arquivo App.config do cliente:

      <endpoint
        address="http://MyServer:8000/MyService/"
        binding="wsHttpBinding"
        bindingConfiguration="WSHttpBinding_IServiceExample"
        contract="IServiceExample"
        behaviorConfiguration="ClientCredBehavior"
        name="WSHttpBinding_IServiceExample">  
        <identity>  
          <userPrincipalName value="name@corp.contoso.com"/>  
        </identity>  
      </endpoint>  
      
    2. Execute o serviço auto-hospedado na conta System ou NetworkService. Você pode executar este comando para criar uma janela de comando na conta do sistema:

      at 12:36 /interactive "cmd.exe"  
      
    3. Hospede o serviço em Serviços de Informações da Internet (IIS), que, por padrão, usa a conta SPN (nome da entidade de serviço).

    4. Registre um novo SPN com o domínio usando SetSPN. Você precisa ser um administrador de domínio para fazer isso.

Para obter mais informações sobre o protocolo Kerberos, consulte Conceitos de segurança usados no WCF e:

Quando lanço uma exceção> FaultException<em que o tipo é uma exceção, sempre recebo um tipo FaultException geral no cliente e não o tipo genérico. O que está a acontecer?

É altamente recomendável que você crie seu próprio tipo de dados de erro personalizado e declare isso como o tipo de detalhe em seu contrato de falha. O motivo é que o uso de tipos de exceção fornecidos pelo sistema:

  • Cria uma dependência de tipo que remove um dos maiores pontos fortes dos aplicativos orientados a serviços.

  • Não pode depender de exceções serializando de forma padrão. Alguns — como SecurityException— podem não ser serializáveis.

  • Expõe detalhes de implementação interna aos clientes. Para obter mais informações, consulte Especificando e tratando falhas em contratos e serviços.

No entanto, se você estiver depurando um aplicativo, poderá serializar informações de exceção e retorná-las ao cliente usando a ServiceDebugBehavior classe.

Parece que as operações unidirecionais e de solicitação-resposta retornam aproximadamente na mesma velocidade quando a resposta não contém dados. O que aconteceu?

Especificar que uma operação é unidirecional significa apenas que o contrato de operação aceita uma mensagem de entrada e não retorna uma mensagem de saída. No WCF, todas as invocações de cliente retornam quando os dados de saída foram gravados no fio ou uma exceção é lançada. As operações unidirecionais funcionam da mesma maneira e podem ser lançadas se o serviço não puder ser localizado ou bloqueadas se o serviço não estiver preparado para aceitar os dados da rede. Normalmente, no WCF, isso resulta em chamadas unidirecionais retornando ao cliente mais rapidamente do que a solicitação-resposta; Mas qualquer condição que retarde o envio dos dados de saída pela rede torna as operações unidirecionais, bem como as operações de solicitação-resposta. Para obter mais informações, consulte One-Way Services e Acessando serviços usando um cliente WCF.

Estou a utilizar um certificado X.509 com o meu serviço e obtenho um System.Security.Cryptography.CryptographicException. O que está a acontecer?

Isso geralmente ocorre depois de alterar a conta de usuário sob a qual o processo de trabalho do IIS é executado. Por exemplo, no Windows XP, se alterar a conta de utilizador predefinida em que o Aspnet_wp.exe é executado a partir de ASPNET para uma conta de utilizador personalizada, poderá ver este erro. Se estiver usando uma chave privada, o processo que a usa precisará ter permissões para acessar o arquivo que armazena essa chave.

Se esse for o caso, você deve conceder privilégios de acesso de leitura à conta do processo para o arquivo que contém a chave privada. Por exemplo, se o processo de trabalho do IIS estiver sendo executado na conta Bob, você precisará conceder a Bob acesso de leitura ao arquivo que contém a chave privada.

Para obter mais informações sobre como dar à conta de usuário correta acesso ao arquivo que contém a chave privada para um certificado X.509 específico, consulte Como tornar os certificados X.509 acessíveis ao WCF.

Mudei o primeiro parâmetro de uma operação de maiúsculas para minúsculas; agora meu cliente lança uma exceção. O que aconteceu?

Os valores dos nomes dos parâmetros na assinatura da operação fazem parte do contrato e diferenciam maiúsculas de minúsculas. Use o System.ServiceModel.MessageParameterAttribute atributo quando precisar distinguir entre o nome do parâmetro local e os metadados que descrevem a operação para aplicativos cliente.

Estou usando uma das minhas ferramentas de rastreamento e recebo um EndpointNotFoundException. O que está a acontecer?

Se você estiver usando uma ferramenta de rastreamento que não seja o mecanismo de rastreamento WCF fornecido pelo sistema e receber uma EndpointNotFoundException que indique que houve uma incompatibilidade de filtro de endereço, você precisará usar a ClientViaBehavior classe para direcionar as mensagens para o utilitário de rastreamento e fazer com que o utilitário redirecione essas mensagens para o endereço de serviço. A ClientViaBehavior classe altera o Via cabeçalho de endereçamento para especificar o próximo endereço de rede separadamente do recetor final, indicado pelo cabeçalho de To endereçamento. Ao fazer isso, no entanto, não altere o endereço do ponto de extremidade, que é usado para estabelecer o To valor.

O exemplo de código a seguir mostra um arquivo de configuração de cliente de exemplo.

<endpoint
  address="http://localhost:8000/MyServer/"  
  binding="wsHttpBinding"  
  bindingConfiguration="WSHttpBinding_IMyContract"  
  behaviorConfiguration="MyClient"
  contract="IMyContract"
  name="WSHttpBinding_IMyContract">  
</endpoint>  
<behaviors>  
  <endpointBehaviors>  
    <behavior name="MyClient">  
      <clientVia viaUri="http://localhost:8001/MyServer/"/>  
    </behavior>  
  </endpointBehaviors>  
</behaviors>  

Qual é o endereço base? Como ele se relaciona com um endereço de ponto final?

Um endereço base é o endereço raiz de uma ServiceHost classe. Por padrão, se você adicionar uma ServiceMetadataBehavior classe à configuração do serviço, o WSDL (Web Services Description Language) para todos os pontos de extremidade que o host publica será recuperado do endereço base HTTP, além de qualquer endereço relativo fornecido ao comportamento de metadados, além de "?wsdl". Se você estiver familiarizado com o ASP.NET e o IIS, o endereço base será equivalente ao diretório virtual.

Compartilhando uma porta entre um ponto de extremidade de serviço e um ponto de extremidade mex usando o NetTcpBinding

Se você especificar o endereço base para um serviço como net.tcp://MyServer:8080/MyService e adicionar os seguintes pontos de extremidade:

<services>  
  <service name="Microsoft.Samples.NetTcp.CalculatorService">  
    <endpoint address="calcsvc" binding ="netTcpBinding" contract="Microsoft.Samples.NetTcp.ICalculator"/>  
    <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" />  
  </service>  
</services>  

E se você modificar uma das configurações NetTcpBinding, conforme mostrado no seguinte trecho de configuração:

<bindings>  
  <netTcpBinding>  
    <binding closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions" hostNameComparisonMode="StrongWildcard" listenBacklog="10" maxBufferPoolSize="524288" maxBufferSize="65536" maxConnections="11" maxReceivedMessageSize="65536">  
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384"/>  
      <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false"/>  
      <security mode="Transport">  
        <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign"/>  
      </security>  
    </binding>  
  </netTcpBinding>  
</bindings>  

Você verá um erro como o seguinte: Exceção não tratada: System.ServiceModel.AddressAlreadyInUseException: Já existe um ouvinte no ponto de extremidade IP 0.0.0.0:9000 Você pode contornar esse erro especificando uma URL totalmente qualificada com uma porta diferente para o ponto de extremidade MEX, conforme mostrado no seguinte trecho de configuração:

<services>  
  <service name="Microsoft.Samples.NetTcp.CalculatorService">  
    <endpoint address="calcsvc" binding ="netTcpBinding" contract="Microsoft.Samples.NetTcp.ICalculator"/>  
    <endpoint address="net.tcp://localhost:9001/servicemodelsamples/mex" binding="mexTcpBinding" contract="IMetadataExchange" />  
  </service>  
</services>  

Ao chamar um aplicativo WCF Web HTTP de um aplicativo WCF SOAP, o serviço retorna o seguinte erro: Método 405 não permitido

Chamar um aplicativo Web HTTP WCF (um serviço que usa o WebHttpBinding e WebHttpBehavior) de um serviço WCF pode gerar a seguinte exceção: Unhandled Exception: System.ServiceModel.FaultException`1[System.ServiceModel.ExceptionDetail]: The remote server returned an unexpected response: (405) Method Not Allowed. Essa exceção ocorre porque o WCF substitui a saída OperationContext com o arquivo OperationContext. Para resolver esse problema, crie uma OperationContextScope operação dentro do serviço Web HTTP do WCF. Por exemplo:

public string Echo(string input)  
{  
    using (new OperationContextScope(this.InnerChannel))  
    {  
        return base.Channel.Echo(input);  
    }  
}  

Consulte também