Delen via


Problemen met berichten in de wachtrij oplossen

Deze sectie bevat veelgestelde vragen en hulp bij het oplossen van problemen voor het gebruik van wachtrijen in Windows Communication Foundation (WCF).

Veelgestelde vragen

V: Ik heb WCF Beta 1 gebruikt en de hotfix MSMQ geïnstalleerd. Moet ik de hotfix verwijderen?

A: Ja. Deze hotfix wordt niet meer ondersteund. WCF werkt nu op MSMQ zonder hotfixvereiste.

V: Er zijn twee bindingen voor MSMQ: NetMsmqBinding en MsmqIntegrationBinding. Wat moet ik gebruiken en wanneer?

A: Gebruik de NetMsmqBinding wanneer u MSMQ wilt gebruiken als transport voor communicatie in de wachtrij tussen twee WCF-toepassingen. Gebruik de MsmqIntegrationBinding wanneer u bestaande MSMQ-toepassingen wilt gebruiken om te communiceren met nieuwe WCF-toepassingen.

V: Moet ik MSMQ upgraden om de NetMsmqBinding bindingen en MsmqIntegration te gebruiken?

A: Nee. Beide bindingen werken met MSMQ 3.0 op Windows XP en Windows Server 2003. Bepaalde functies van de bindingen komen beschikbaar wanneer u een upgrade uitvoert naar MSMQ 4.0 in Windows Vista.

V: Welke functies van de NetMsmqBinding bindingen en MsmqIntegrationBinding zijn beschikbaar in MSMQ 4.0, maar niet in MSMQ 3.0?

A: De volgende functies zijn beschikbaar in MSMQ 4.0, maar niet in MSMQ 3.0:

  • Aangepaste wachtrij met onbestelbare berichten wordt alleen ondersteund op MSMQ 4.0.

  • MSMQ 3.0 en 4.0 verwerken gifberichten op verschillende manieren.

  • Alleen MSMQ 4.0 ondersteunt extern uitgevoerde leesbewerkingen.

V: Kan ik MSMQ 3.0 aan de ene kant van een communicatie in de wachtrij en MSMQ 4.0 aan de andere kant gebruiken?

A: Ja.

V: Ik wil bestaande MSMQ-toepassingen integreren met nieuwe WCF-clients of -servers. Moet ik beide zijden van mijn MSMQ-infrastructuur upgraden?

A: Nee. U hoeft aan geen van beide zijden een upgrade naar MSMQ 4.0 uit te voeren.

Problemen oplossen

Deze sectie bevat antwoorden op de meest voorkomende problemen. Sommige problemen die bekende beperkingen zijn, worden ook beschreven in de opmerkingen bij de release.

V: Ik probeer een privéwachtrij te gebruiken en ik krijg de volgende uitzondering: System.InvalidOperationException: De URL is ongeldig. De URL voor de wachtrij mag het teken '$' niet bevatten. Gebruik de syntaxis in net.msmq://machine/private/queueName om een privéwachtrij aan te pakken.

A: Controleer de URI (Uniform Resource Identifier) van de wachtrij in uw configuratie en code. Gebruik het teken '$' niet in de URI. Als u bijvoorbeeld een privéwachtrij met de naam OrdersQueue wilt adresseren, geeft u de URI op als net.msmq://localhost/private/ordersQueue.

V: Het aanroepen ServiceHost.Open() van mijn toepassing in de wachtrij genereert de volgende uitzondering: System.ArgumentException: een basisadres kan geen URI-queryreeks bevatten. Hoe komt dat?

A: Controleer de wachtrij-URI in uw configuratiebestand en in uw code. Hoewel MSMQ-wachtrijen het gebruik van het teken '?' ondersteunen, interpreteren URI's dit teken als het begin van een tekenreeksquery. U kunt dit probleem voorkomen door wachtrijnamen te gebruiken die geen tekens '?' bevatten.

V: Mijn verzendbewerking is voltooid, maar er wordt geen servicebewerking aangeroepen op de ontvanger. Hoe komt dat?

A: Als u het antwoord wilt bepalen, doorloopt u de volgende controlelijst:

  • Controleer of de vereisten voor de transactionele wachtrij compatibel zijn met de opgegeven garanties. Houd rekening met de volgende principes:

    • U kunt duurzame berichten (datagrammen en sessies) met 'exactly once'-garanties (ExactlyOnce = true) alleen verzenden naar een transactionele wachtrij.

    • U kunt sessies alleen verzenden met 'exactly once'-garanties.

    • Een transactie is vereist voor het ontvangen van berichten in een sessie van een transactionele wachtrij.

    • U kunt vluchtige of duurzame berichten (alleen datagrammen) zonder garanties (ExactlyOnce = false) verzenden of ontvangen naar een niet-transactionele wachtrij.

  • Controleer de wachtrij met onbestelbare berichten. Als u de berichten daar vindt, bepaalt u waarom ze niet zijn bezorgd.

  • Controleer de uitgaande wachtrijen op connectiviteit of het oplossen van problemen.

V: Ik heb een aangepaste wachtrij met onbestelbare berichten opgegeven, maar wanneer ik de afzendertoepassing start, krijg ik een uitzondering dat de wachtrij met onbestelbare berichten niet wordt gevonden of dat de verzendende toepassing geen machtiging heeft voor de wachtrij met onbestelbare berichten. Waarom gebeurt dit?

A: De aangepaste wachtrij-URI voor onbestelbare berichten moet een 'localhost' of de computernaam in het eerste segment bevatten, bijvoorbeeld net.msmq://localhost/private/myAppdead-letter queue.

V: Is het altijd nodig om een aangepaste wachtrij met onbestelbare berichten te definiëren of is er een standaardwachtrij met onbestelbare brieven?

A: Als de garanties 'exact één keer' (ExactlyOnce = true) zijn en u geen aangepaste wachtrij met onbestelbare berichten opgeeft, is de standaardwaarde een systeembrede transactionele wachtrij met onbestelbare brieven.

Als de garanties geen (ExactlyOnce = false) zijn, is de standaardwaarde geen wachtrijfunctionaliteit voor onbestelbare berichten.

V: Mijn service genereert SvcHost.Open met het bericht 'EndpointListener-vereisten kunnen niet worden voldaan door de ListenerFactory'. Hoe komt dat?

A. Controleer uw servicecontract. Mogelijk bent u vergeten om 'IsOneWay=true' op alle servicebewerkingen in te voeren. Wachtrijen ondersteunen alleen servicebewerkingen in één richting.

V: Er staan berichten in de wachtrij, maar er wordt geen servicebewerking aangeroepen. Wat is het probleem?

A: Bepaal of er een fout optreedt bij uw servicehost. U kunt dit controleren door de tracering te bekijken of door te implementeren IErrorHandler. Servicehostfouten, standaard, als er een gifbericht wordt gedetecteerd.

V: Er staan berichten in de wachtrij, maar mijn web-gehoste service in de wachtrij wordt niet geactiveerd. Hoe komt dat?

A: De meest voorkomende reden is machtigingen.

  1. Zorg ervoor dat het NetMsmqActivator proces wordt uitgevoerd en dat de identiteit van het NetMsmqActivator proces lees- en zoekmachtigingen krijgt voor de wachtrij.

  2. Als de NetMsmqActivator wachtrijen op een externe computer bewaakt, moet u ervoor zorgen dat deze NetMsmqActivator niet wordt uitgevoerd onder een beperkt token. De uitvoeren NetMsmqActivator met een onbeperkt token:

    sc sidtype NetMsmqActivator unrestricted
    

Raadpleeg voor niet-beveiligingsgerelateerde problemen met de webhost: WebHosting van een toepassing in de wachtrij.

V: Wat is de eenvoudigste manier om toegang te krijgen tot sessies?

A: Stel AutoAanvullen=true in op de bewerking die overeenkomt met het laatste bericht in de sessie en stel AutoAanvullen=false in op alle resterende servicebewerkingen.

V: Waarom genereert mijn service een ProtocolException bij het lezen van een wachtrij die zowel sessieberichten in de wachtrij als datagramberichten in de wachtrij bevat?

A: Er is een fundamenteel verschil in de manier waarop sessieberichten in de wachtrij en datagramberichten in de wachtrij worden samengesteld. Daarom kan een service die verwacht een sessiebericht in de wachtrij te lezen, geen datagrambericht in de wachtrij ontvangen en kan een service die verwacht een datagrambericht in de wachtrij te lezen, geen sessiebericht ontvangen. Als u beide typen berichten uit dezelfde wachtrij probeert te lezen, treedt de volgende uitzondering op:

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.

De systeemwachtrij met onbestelbare berichten, evenals een aangepaste wachtrij met onbestelbare berichten, is bijzonder gevoelig voor dit probleem als een toepassing zowel sessieberichten in de wachtrij als datagramberichten in de wachtrij vanaf dezelfde computer verzendt. Als een bericht niet kan worden verzonden, wordt het verplaatst naar de wachtrij met onbestelbare berichten. Onder deze omstandigheden is het mogelijk om zowel sessie- als datagramberichten in de wachtrij met onbestelbare berichten te plaatsen. Er is geen manier om beide typen berichten tijdens runtime te scheiden bij het lezen uit een wachtrij. Daarom moeten toepassingen niet zowel sessieberichten in de wachtrij als datagramberichten in de wachtrij van dezelfde computer verzenden.

MSMQ-integratie: specifieke probleemoplossing

V: Wanneer ik een bericht verzend of wanneer ik de servicehost open, krijg ik een foutbericht dat aangeeft dat het schema onjuist is. Hoe komt dat?

A: Wanneer u de MSMQ-integratiebinding gebruikt, moet u het schema msmq.formatname gebruiken. Bijvoorbeeld msmq.formatname:DIRECT=OS:.\private$\OrdersQueue. Maar wanneer u de aangepaste wachtrij met onbestelbare berichten opgeeft, moet u het schema net.msmq gebruiken.

V: Wanneer ik een openbare of persoonlijke indelingsnaam gebruik en de servicehost open in Windows Vista, krijg ik een foutmelding. Hoe komt dat?

A: Het WCF-integratiekanaal in Windows Vista controleert of een subruimte kan worden geopend voor de hoofdtoepassingswachtrij voor het verwerken van gifberichten. De naam van de subruimte is afgeleid van een msmq.formatname-URI die is doorgegeven aan de listener. De naam van de subruimte in MSMQ kan alleen een directe indelingsnaam zijn. U ziet dus de fout. Wijzig de wachtrij-URI in een directe indelingsnaam.

V: Wanneer u een bericht ontvangt van een MSMQ-toepassing, staat het bericht in de wachtrij en wordt het niet gelezen door de ontvangende WCF-toepassing. Hoe komt dat?

A: Controleer of het bericht een hoofdtekst heeft. Als het bericht geen hoofdtekst heeft, negeert het MSMQ-integratiekanaal het bericht. Implementeer IErrorHandler om op de hoogte te worden gesteld van uitzonderingen en controleer de traceringen.

V: Wanneer ik het voorbeeld uitvoer dat gebruikmaakt van een standaardbinding in de werkgroepmodus, lijken berichten verzonden te worden, maar worden ze nooit ontvangen door de ontvanger.

A: Standaard worden berichten ondertekend met behulp van een intern MSMQ-certificaat waarvoor de Active Directory-adreslijstservice is vereist. In de werkgroepmodus mislukt het ondertekenen van het bericht omdat Active Directory niet beschikbaar is. Het bericht belandt dus in de wachtrij met onbestelbare berichten en de oorzaak van de fout, zoals 'Ongeldige handtekening', wordt aangegeven.

De tijdelijke oplossing is om de beveiliging uit te schakelen. Dit wordt gedaan door in te stellen Mode = None dat deze werkt in de werkgroepmodus.

Een andere tijdelijke oplossing is om de MsmqTransportSecurity op te halen uit de Transport eigenschap en deze in te stellen op en het clientcertificaat in te Certificatestellen.

Nog een tijdelijke oplossing is het installeren van MSMQ met Active Directory-integratie.

V: Wanneer ik een bericht met standaardbinding (transportbeveiliging ingeschakeld) in Active Directory naar een wachtrij verzend, krijg ik het bericht 'intern certificaat niet gevonden'. Hoe kan ik dit probleem oplossen?

A: Dit betekent dat het certificaat in Active Directory voor de afzender moet worden vernieuwd. Open hiervoor Configuratiescherm, Systeembeheer, Computerbeheer, klik met de rechtermuisknop op MSMQ en selecteer Eigenschappen. Selecteer het tabblad Gebruikerscertificaat en klik op de knop Verlengen .

V: Wanneer ik een bericht verzend met en Certificate het certificaat opgeeft dat moet worden gebruikt, krijg ik het bericht 'Ongeldig certificaat'. Hoe kan ik dit probleem oplossen?

A: U kunt een certificaatarchief van een lokale computer niet gebruiken met de certificaatmodus. U moet het certificaat kopiëren van het certificaatarchief van de computer naar het huidige gebruikersarchief met behulp van de certificaatmodule. Ga als volgende te werk om de module Certificaat op te halen:

  1. Klik op Start, selecteer Uitvoeren, typ mmcen klik op OK.

  2. Open in de Microsoft Management Console het menu Bestand en selecteer Module toevoegen/verwijderen.

  3. Klik in het dialoogvenster Module toevoegen/verwijderen op de knop Toevoegen .

  4. Selecteer certificaten in het dialoogvenster Zelfstandige module toevoegen en klik op Toevoegen.

  5. Selecteer in het dialoogvenster Certificatenmodulede optie Mijn gebruikersaccount en klik op Voltooien.

  6. Voeg vervolgens een tweede module Certificaten toe met behulp van de vorige stappen, maar selecteer deze keer Computeraccount en klik op Volgende.

  7. Selecteer Lokale computer en klik op Voltooien. U kunt nu certificaten slepen en neerzetten van het certificaatarchief van de computer naar het huidige gebruikersarchief.

V: Wanneer mijn service leest uit een wachtrij op een andere computer in de werkgroepmodus, krijg ik een uitzondering 'toegang geweigerd'.

A: In de werkgroepmodus kan een externe toepassing alleen toegang krijgen tot de wachtrij als de toepassing gemachtigd is voor toegang tot de wachtrij. Voeg 'Anonieme aanmelding' toe aan de toegangsbeheerlijst (ACL) van de wachtrij en geef deze leesmachtiging.

V: Wanneer een netwerkserviceclient (of een client die geen domeinaccount heeft) een bericht in de wachtrij verzendt, mislukt het verzenden met een ongeldig certificaat. Hoe kan ik dit probleem oplossen?

A: Controleer de bindingsconfiguratie. Voor de standaardbinding is MSMQ-transportbeveiliging ingeschakeld om het bericht te ondertekenen. Schakel het uit.

Externe transacties ontvangen

V: Wanneer ik een wachtrij op computer A heb en een WCF-service die berichten leest uit een wachtrij op computer B (het scenario voor extern transacted ontvangen), worden berichten niet gelezen uit de wachtrij. Traceringsinformatie geeft aan dat de ontvangst is mislukt met het bericht 'Transactie kan niet worden geïmporteerd'. Wat kan ik doen om dit op te lossen?

A: Er zijn drie mogelijke redenen hiervoor:

  • Als u zich in de domeinmodus bevindt, vereist externe transactie voor ontvangst microsoft Distributed Transaction Coordinator (MSDTC) netwerktoegang. U kunt dit inschakelen met behulp van Onderdelen toevoegen/verwijderen.

    Schermopname van het inschakelen van netwerk-DTC-toegang.

  • Controleer de verificatiemodus voor communicatie met de transactiebeheerder. Als u zich in de werkgroepmodus bevindt, moet 'Geen verificatie vereist' zijn geselecteerd. Als u zich in de domeinmodus bevindt, moet 'Wederzijdse verificatie vereist' zijn geselecteerd.

    XA-transacties inschakelen

  • Zorg ervoor dat MSDTC voorkomt in de lijst met uitzonderingen in de firewallinstellingen voor internetverbinding .

  • Zorg ervoor dat u Windows Vista gebruikt. MSMQ in Windows Vista ondersteunt extern uitgevoerd lezen. MSMQ in eerdere Versies van Windows biedt geen ondersteuning voor extern uitgevoerd lezen.

V: Wanneer de service die uit de wachtrij wordt gelezen een netwerkservice is, bijvoorbeeld in een webhost, waarom krijg ik dan een uitzondering voor geweigerde toegang wanneer ik lees uit de wachtrij?

A: Leestoegang voor de netwerkservice moet worden toegevoegd aan de wachtrij-ACL om ervoor te zorgen dat een netwerkservice kan lezen uit de wachtrij.

V: Kan ik de MSMQ-activeringsservice gebruiken om toepassingen te activeren op basis van berichten in een wachtrij op een externe computer?

A: Ja. Hiervoor moet u de MSMQ-activeringsservice configureren om te worden uitgevoerd als een netwerkservice en netwerkservicetoegang toevoegen aan de wachtrij op de externe computer.

Aangepaste MSMQ-bindingen gebruiken met ReceiveContext ingeschakeld

Wanneer u een aangepaste MSMQ-binding gebruikt waarvoor ReceiveContext is ingeschakeld, wordt voor het verwerken van een binnenkomend bericht een threadgroepthread gebruikt, omdat systeemeigen MSMQ geen ondersteuning biedt voor I/O-voltooiing voor asynchrone ReceiveContext ontvangst. Dit komt omdat de verwerking van een dergelijk bericht gebruikmaakt van interne transacties voor en MSMQ geen ondersteuning biedt voor ReceiveContext asynchrone verwerking. U kunt dit probleem omzeilen door een SynchronousReceiveBehavior toe te voegen aan het eindpunt om synchrone verwerking af te dwingen of in te stellen MaxPendingReceives op 1.