Resolução de Problemas de Mensagens em Fila
Esta secção contém perguntas comuns e ajuda de resolução de problemas para a utilização de filas no Windows Communication Foundation (WCF).
Perguntas Comuns
P: Utilizei o WCF Beta 1 e instalei a correção MSMQ. Preciso de remover a correção?
R: Sim, sim. Esta correção já não é suportada. O WCF funciona agora no MSMQ sem um requisito de correção.
P: Existem dois enlaces para MSMQ: NetMsmqBinding e MsmqIntegrationBinding. O que devo utilizar e quando?
R: Utilize o quando pretender utilizar o NetMsmqBinding MSMQ como um transporte para comunicação em fila entre duas aplicações WCF. Utilize quando MsmqIntegrationBinding pretender utilizar aplicações MSMQ existentes para comunicar com novas aplicações WCF.
P: Tenho de atualizar o MSMQ para utilizar os NetMsmqBinding enlaces e MsmqIntegration
?
R: Não. Ambos os enlaces funcionam com o MSMQ 3.0 no Windows XP e Windows Server 2003. Determinadas funcionalidades dos enlaces ficam disponíveis quando atualiza para o MSMQ 4.0 no Windows Vista.
P: Que funcionalidades dos NetMsmqBinding enlaces e MsmqIntegrationBinding estão disponíveis no MSMQ 4.0, mas não no MSMQ 3.0?
R: As seguintes funcionalidades estão disponíveis no MSMQ 4.0, mas não no MSMQ 3.0:
A fila de mensagens não entregues personalizada é suportada apenas no MSMQ 4.0.
O MSMQ 3.0 e 4.0 processam mensagens venenosas de forma diferente.
Apenas o MSMQ 4.0 suporta leitura transacionada remota.
P: Posso utilizar o MSMQ 3.0 de um lado de uma comunicação em fila e o MSMQ 4.0 do outro lado?
R: Sim, sim.
P: Quero integrar aplicações MSMQ existentes com novos clientes ou servidores WCF. Preciso de atualizar ambos os lados da minha infraestrutura MSMQ?
R: Não. Não tem de atualizar para o MSMQ 4.0 em ambos os lados.
Resolução de problemas
Esta secção contém respostas para os problemas mais comuns de resolução de problemas. Alguns problemas que são limitações conhecidas também são descritos nas notas de versão.
P: Estou a tentar utilizar uma fila privada e obtenho a seguinte exceção: : System.InvalidOperationException
o URL é inválido. O URL da fila não pode conter o caráter '$'. Utilize a sintaxe em net.msmq://machine/private/queueName para abordar uma fila privada.
R: Verifique a fila Uniform Resource Identifier (URI) na configuração e no código. Não utilize o caráter "$" no URI. Por exemplo, para abordar uma fila privada denominada OrdersQueue, especifique o URI como net.msmq://localhost/private/ordersQueue
.
P: Chamar ServiceHost.Open()
na minha aplicação em fila gera a seguinte exceção: : System.ArgumentException
Um endereço base não pode conter uma cadeia de consulta URI. Porquê?
R: Verifique o URI da fila no ficheiro de configuração e no código. Embora as filas MSMQ suportem a utilização do caráter '?', os URIs interpretam este caráter como o início de uma consulta de cadeia. Para evitar este problema, utilize nomes de filas que não contenham carateres '?'.
P: O meu envio foi bem-sucedido, mas nenhuma operação de serviço é invocada no recetor. Porquê?
R: Para determinar a resposta, veja a seguinte lista de verificação:
Verifique se os requisitos de fila transacional são compatíveis com as garantias especificadas. Tenha em atenção os seguintes princípios:
Pode enviar mensagens duráveis (datagramas e sessões) com garantias "exatamente uma vez" (ExactlyOnce =
true
) apenas para uma fila transacional.Só pode enviar sessões com garantias "exatamente uma vez".
É necessária uma transação para receber mensagens numa sessão de uma fila transacional.
Pode enviar ou receber mensagens voláteis ou duráveis (apenas datagramas) sem garantias (ExactlyOnce =
false
) apenas para uma fila não transacional.
Verifique a fila de mensagens não entregues. Se encontrar as mensagens aí, determine por que motivo não foram entregues.
Verifique as filas de saída quanto à conectividade ou resolução de problemas.
P: Especifiquei uma fila de mensagens não entregues personalizada, mas quando inicio a aplicação do remetente, recebo uma exceção de que a fila de mensagens não entregues não foi encontrada ou que a aplicação de envio não tem permissão para a fila de mensagens não entregues. Porque é que isto está a acontecer?
R: O URI da fila de mensagens não entregues personalizado tem de incluir um "localhost" ou o nome do computador no primeiro segmento, por exemplo, net.msmq://localhost/private/myAppdead-letter fila.
P: É sempre necessário definir uma fila de mensagens não entregues personalizada ou existe uma fila de mensagens não entregues predefinida?
R: Se as garantias forem "exatamente uma vez" () eExactlyOnce = true
se não especificar uma fila de mensagens não entregues personalizada, a predefinição é uma fila de mensagens não entregues transacional ao nível do sistema.
Se as garantias não forem nenhuma (ExactlyOnce = false
), a predefinição não é nenhuma funcionalidade de fila de mensagens não entregues.
P: O meu serviço é colocado no SvcHost.Open com uma mensagem "Não é possível cumprir os requisitos do EndpointListener pelo ListenerFactory". Porquê?
A. Verifique o contrato de serviço. Pode ter-se esquecido de colocar "IsOneWay=true
" em todas as operações do serviço. As filas suportam apenas operações de serviço unidirecionais.
P: Existem mensagens na fila, mas não é invocada nenhuma operação de serviço. Qual é o problema?
R: Determine se o anfitrião do serviço tem falhas. Pode verificar ao observar o rastreio ou implementar IErrorHandler
. O anfitrião do serviço falha, por predefinição, se for detetada uma mensagem venenosa.
P: Existem mensagens na fila, mas o meu serviço alojado na Web não está a ser ativado. Porquê?
R: O motivo mais comum são as permissões.
Certifique-se de que o
NetMsmqActivator
processo está em execução e que a identidade doNetMsmqActivator
processo recebe permissão de leitura e procura na fila.Se estiver a
NetMsmqActivator
monitorizar filas num computador remoto, certifique-se de queNetMsmqActivator
não é executado num token restrito. Para executar oNetMsmqActivator
com um token sem restrições:sc sidtype NetMsmqActivator unrestricted
Para problemas de anfitrião Web não relacionados com segurança, veja: Alojamento na Web de uma Aplicação em Fila.
P: Qual é a forma mais fácil de aceder às sessões?
R: Defina Conclusão Automática=true
na operação que corresponde à última mensagem na sessão e defina Conclusão Automática=false
em todas as operações de serviço restantes.
P: Porque é que o meu serviço gera uma ProtocolException
ao ler a partir de uma fila que contém mensagens de sessão em fila e mensagens de datagrama em fila?
R: Existe uma diferença fundamental na forma como as mensagens de sessão em fila e as mensagens de datagrama em fila são compostas. Por este motivo, um serviço que espera ler uma mensagem de sessão em fila não pode receber uma mensagem de datagrama em fila e um serviço que espera ler uma mensagem de datagrama em fila não pode receber uma mensagem de sessão. Tentar ler ambos os tipos de mensagens da mesma fila gera a seguinte exceção:
System.ServiceModel.MsmqPoisonMessageException: The transport channel detected a poison message. This occurred because the message exceeded the maximum number of delivery attempts or because the channel detected a fundamental problem with the message. The inner exception may contain additional information.
---> System.ServiceModel.ProtocolException: An incoming MSMQ message contained invalid or unexpected .NET Message Framing information in its body. The message cannot be received. Ensure that the sender is using a compatible service contract with a matching SessionMode.
A fila de mensagens não entregues do sistema, bem como qualquer fila de mensagens não entregues personalizada, é particularmente suscetível a este problema se uma aplicação enviar mensagens de sessão em fila e mensagens de datagrama em fila a partir do mesmo computador. Se não for possível enviar uma mensagem com êxito, esta é movida para a fila de mensagens não entregues. Nestas circunstâncias, é possível ter mensagens de sessão e de datagrama na fila de mensagens não entregues. Não é possível separar ambos os tipos de mensagens no tempo de execução ao ler a partir de uma fila, pelo que as aplicações não devem enviar mensagens de sessão em fila e mensagens de datagrama em fila do mesmo computador.
Integração do MSMQ: Resolução de Problemas Específica
P: Quando envio uma mensagem ou quando abro o anfitrião do serviço, recebo um erro que indica que o esquema está errado. Porquê?
R: Quando utiliza o enlace de integração do MSMQ, tem de utilizar o esquema msmq.formatname. Por exemplo, msmq.formatname:DIRECT=OS:.\private$\OrdersQueue. Contudo, quando especificar a fila de mensagens não entregues personalizada, tem de utilizar o esquema net.msmq.
P: Quando utilizo um nome de formato público ou privado e abro o anfitrião do serviço no Windows Vista, recebo um erro. Porquê?
R: O canal de integração do WCF no Windows Vista verifica se é possível abrir uma subconsulta para a fila de aplicações principal para processar mensagens venenosas. O nome da subconsulta é derivado de um URI msmq.formatname transmitido ao serviço de escuta. O nome da subconsulta no MSMQ só pode ser um nome de formato direto. Assim, verá o erro. Altere o URI da fila para um nome de formato direto.
P: Ao receber uma mensagem de uma aplicação MSMQ, a mensagem encontra-se na fila e não é lida pela aplicação WCF que recebe. Porquê?
R: Verifique se a mensagem tem um corpo. Se a mensagem não tiver corpo, o canal de integração MSMQ ignora a mensagem. Implemente IErrorHandler
para ser notificado das exceções e verifique os rastreios.
Security-Related Resolução de Problemas
P: Quando executo o exemplo que utiliza um enlace predefinido no modo de grupo de trabalho, as mensagens parecem ser enviadas, mas nunca são recebidas pelo recetor.
R: Por predefinição, as mensagens são assinadas com um certificado interno MSMQ que requer o serviço de diretório do Active Directory. No modo de grupo de trabalho, uma vez que o Active Directory não está disponível, a assinatura da mensagem falha. Assim, a mensagem é apresentada na fila de letras mortas e a causa da falha, como "Assinatura incorreta", é indicada.
A solução é desativar a segurança. Isto é feito ao definir Mode = None para que funcione no modo de grupo de trabalho.
Outra solução é obter a MsmqTransportSecurity da Transport propriedade, defini-la como Certificatee definir o certificado de cliente.
Outra solução é instalar o MSMQ com a integração do Active Directory.
P: Quando envio uma mensagem com o enlace predefinido (segurança de transporte ativada) no Active Directory para uma fila, recebo uma mensagem "certificado interno não encontrado". Como devo proceder para corrigir isto?
R: Isto significa que o certificado no Active Directory para o remetente tem de ser renovado. Para tal, abra Painel de Controlo, Ferramentas Administrativas, Gestão de Computadores, clique com o botão direito do rato em MSMQ e selecione Propriedades. Selecione o separador Certificado de Utilizador e clique no botão Renovar .
P: Quando envio uma mensagem utilizando Certificate e especifique o certificado a utilizar, recebo uma mensagem "Certificado inválido". Como devo proceder para corrigir isto?
R: Não pode utilizar um arquivo de certificados de máquina local com o modo de certificado. Tem de copiar o certificado do arquivo de certificados do computador para o arquivo de utilizadores atual com o snap-in Certificado. Para obter o snap-in Certificado:
Clique em Iniciar, selecione Executar, escreva
mmc
e clique em OK.Na Consola de Gestão da Microsoft, abra o menu Ficheiro e selecione Adicionar/Remover Snap-in.
Na caixa de diálogo Adicionar/Remover Snap-in , clique no botão Adicionar .
Na caixa de diálogo Adicionar Snap-in Autónomo , selecione Certificados e clique em Adicionar.
Na caixa de diálogo Snap-in Certificados , selecione A minha conta de utilizador e clique em Concluir.
Em seguida, adicione um segundo snap-in Certificados com os passos anteriores, mas desta vez selecione Conta de computador e clique em Seguinte.
Selecione Computador Local e clique em Concluir. Agora, pode arrastar e largar certificados do arquivo de certificados do computador para o arquivo de utilizadores atual.
P: Quando o meu serviço lê a partir de uma fila noutro computador no modo de grupo de trabalho, recebo uma exceção de "acesso negado".
R: No modo de grupo de trabalho, para que uma aplicação remota obtenha acesso à fila, a aplicação tem de ter permissão para aceder à fila. Adicione "Início de sessão anónimo" à lista de controlo de acesso (ACL) da fila e dê-lhe permissão de leitura.
P: Quando um cliente de serviço de rede (ou qualquer cliente que não tenha uma conta de domínio) envia uma mensagem em fila, o envio falha com um certificado inválido. Como devo proceder para corrigir isto?
R: Verifique a configuração de enlace. O enlace predefinido tem a segurança de transporte MSMQ ativada para assinar a mensagem. Desative-o.
Receções Transacionadas Remotas
P: Quando tenho uma fila no computador A e um serviço WCF que lê mensagens de uma fila no computador B (o cenário de receção transacionada remota), as mensagens não são lidas a partir da fila. As informações de rastreio indicam que a receção falhou com a mensagem "Não é possível importar a transação". O que posso fazer para corrigir isto?
R: Existem três razões possíveis para isto:
Se estiver no modo de domínio, a receção transacionada remota requer acesso à rede do Coordenador de Transações Distribuídas da Microsoft (MSDTC). Pode ativar esta opção com Adicionar/Remover Componentes.
Verifique o modo de autenticação para comunicar com o gestor de transações. Se estiver no modo de grupo de trabalho, tem de selecionar "Sem Autenticação Necessária". Se estiver no modo de domínio, tem de selecionar "Autenticação Mútua Necessária".
Certifique-se de que o MSDTC está na lista de exceções nas definições da Firewall de Ligações à Internet .
Certifique-se de que está a utilizar o Windows Vista. O MSMQ no Windows Vista suporta leitura transacionada remota. O MSMQ em versões anteriores do Windows não suporta leitura transacionada remota.
P: Quando a leitura do serviço a partir da fila é um serviço de rede, por exemplo, num anfitrião Web, por que motivo obtenho uma exceção de acesso negado ao ler a partir da fila?
R: O acesso de leitura do serviço de rede tem de ser adicionado à ACL de fila para garantir que um serviço de rede pode ler a partir da fila.
P: Posso utilizar o serviço de ativação MSMQ para ativar aplicações com base em mensagens numa fila num computador remoto?
R: Sim, sim. Para tal, tem de configurar o serviço de ativação MSMQ para ser executado como um serviço de rede e adicionar acesso de serviço de rede à fila no computador remoto.
Utilizar Enlaces MSMQ Personalizados com ReceiveContext Ativado
Ao utilizar um enlace MSMQ personalizado com ReceiveContext ativado, o processamento de uma mensagem recebida utiliza um thread de conjunto de threads porque o MSMQ nativo não suporta a conclusão de E/S para receções assíncronas ReceiveContext . Isto deve-se ao facto de o processamento dessa mensagem utilizar transações internas para ReceiveContext e o MSMQ não suportar o processamento assíncrono. Para contornar este problema, pode adicionar um SynchronousReceiveBehavior ao ponto final para forçar o processamento síncrono ou definir MaxPendingReceives como 1.