Sdílet prostřednictvím


Řešení potíží se zasíláním zpráv zařazovaných do front

Tato část obsahuje běžné dotazy a nápovědu k řešení potíží s používáním front ve službě Windows Communication Foundation (WCF).

Běžné otázky

Q: Použil(a) jsem WCF Beta 1 a nainstaloval(a) jsem opravu hotfix MSMQ. Musím odebrat opravu hotfix?

Odpověď: Ano. Tato oprava hotfix již není podporována. WCF teď funguje na MSMQ bez požadavku na opravu hotfix.

Q: Pro MSMQ existují dvě vazby: NetMsmqBinding a MsmqIntegrationBinding. Co mám použít a kdy?

A:NetMsmqBinding Pokud chcete použít MSMQ jako přenos pro komunikaci mezi dvěma aplikacemi WCF ve frontě, použijte příkaz MSMQ. MsmqIntegrationBinding Pokud chcete použít existující aplikace MSMQ ke komunikaci s novými aplikacemi WCF, použijte příkaz .

Q: Musím upgradovat MSMQ, aby bylo možné používat NetMsmqBinding vazby a MsmqIntegration ?

O: Ne. Obě vazby fungují s MSMQ 3.0 v systémech Windows XP a Windows Server 2003. Některé funkce vazeb budou k dispozici při upgradu na MSMQ 4.0 v systému Windows Vista.

Q: Jaké funkce NetMsmqBinding vazeb a MsmqIntegrationBinding jsou k dispozici v MSMQ 4.0, ale ne v MSMQ 3.0?

A: Následující funkce jsou k dispozici v MSMQ 4.0, ale ne v MSMQ 3.0:

  • Vlastní fronta nedoručených zpráv je podporována pouze v MSMQ 4.0.

  • MSMQ 3.0 a 4.0 zpracovávají jedovaté zprávy jinak.

  • Vzdálené transakční čtení podporuje pouze MSMQ 4.0.

Q: Můžu použít MSMQ 3.0 na jedné straně komunikace ve frontě a MSMQ 4.0 na druhé straně?

Odpověď: Ano.

Q: Chci integrovat stávající aplikace MSMQ s novými klienty nebo servery WCF. Musím upgradovat obě strany infrastruktury MSMQ?

O: Ne. Na msmq 4.0 na obou stranách nemusíte upgradovat.

Řešení potíží

Tato část obsahuje odpovědi na nejčastější problémy s řešením potíží. Některé problémy, které jsou známými omezeními, jsou také popsány v poznámkách k verzi.

Q: Pokouším se použít soukromou frontu a zobrazí se následující výjimka: System.InvalidOperationExceptionAdresa URL je neplatná. Adresa URL fronty nesmí obsahovat znak $. K vyřešení privátní fronty použijte syntaxi v net.msmq://machine/private/queueName.

A: Zkontrolujte identifikátor URI (Uniform Resource Identifier) fronty v konfiguraci a kódu. Nepoužívejte znak $v identifikátoru URI. Pokud chcete například adresovat privátní frontu s názvem OrdersQueue, zadejte identifikátor URI jako net.msmq://localhost/private/ordersQueue.

Q: Volání ServiceHost.Open() aplikace ve frontě vyvolá následující výjimku: System.ArgumentExceptionZákladní adresa nemůže obsahovat řetězec dotazu URI. Proč?

A: Zkontrolujte identifikátor URI fronty v konfiguračním souboru a v kódu. Zatímco fronty MSMQ podporují použití znaku ?, identifikátory URI interpretují tento znak jako začátek řetězcového dotazu. Chcete-li se tomuto problému vyhnout, použijte názvy front, které neobsahují znaky ?.

Q: Odeslání bylo úspěšné, ale na příjemci není vyvolána žádná operace služby. Proč?

A: Pokud chcete zjistit odpověď, projděte si následující kontrolní seznam:

  • Zkontrolujte, jestli jsou požadavky transakční fronty kompatibilní se zadanými zárukami. Mějte na paměti následující zásady:

    • Trvalé zprávy (datagramy a relace) s zárukou "přesně jednou" (ExactlyOnce = true) můžete posílat pouze do transakční fronty.

    • Relace můžete posílat jenom s "přesně jednou" zárukou.

    • Transakce je vyžadována pro příjem zpráv v relaci z transakční fronty.

    • Můžete odesílat nebo přijímat nestálé nebo trvalé zprávy (pouze datagramy) bez záruk (ExactlyOnce = false) pouze do neakční fronty.

  • Zkontrolujte frontu nedoručených zpráv. Pokud tam najdete zprávy, určete, proč se nedoručily.

  • Zkontrolujte, jestli odchozí fronty neřeší problémy s připojením nebo řešením problémů.

Q: Zadal(a) jsem vlastní frontu nedoručených zpráv, ale při spuštění aplikace odesílatele se zobrazí výjimka, že fronta nedoručených zpráv nebyla nalezena nebo odesílající aplikace nemá oprávnění k frontě nedoručených zpráv. Proč k tomu dochází?

A: Identifikátor URI vlastní fronty nedoručených zpráv musí obsahovat "localhost" nebo název počítače v prvním segmentu, například net.msmq://localhost/private/myAppdead-letter queue.

Q: Je vždy nutné definovat vlastní frontu nedoručených zpráv, nebo existuje výchozí fronta nedoručených zpráv?

A: Pokud jsou záruky "přesně jednou" (ExactlyOnce = true) a nezadáte vlastní frontu nedoručených zpráv, je výchozí fronta nedoručených zpráv pro celý systém.

Pokud záruky nejsou žádné (ExactlyOnce = false), pak výchozí je žádná funkce fronty nedoručených zpráv.

Q: Moje služba vyvolá na SvcHost.Open se zprávou "EndpointListener requirements cannot be splněny v ListenerFactory". Proč?

A. Zkontrolujte servisní smlouvu. Možná jste zapomněli u všech operací služby zadat "IsOneWay=true". Fronty podporují pouze jednosměrné operace služby.

Q: Ve frontě jsou zprávy, ale není vyvolána žádná operace služby. V čem je problém?

A: Zjistěte, jestli je váš hostitel služby chybný. Můžete to zkontrolovat tak, že se podíváte na trasování nebo implementujete IErrorHandler. Ve výchozím nastavení dojde k chybám hostitele služby, pokud je zjištěna jedovatá zpráva.

Q: Ve frontě jsou zprávy, ale služba ve frontě hostovaná na webu se neaktivuje. Proč?

A: Nejčastějším důvodem jsou oprávnění.

  1. Ujistěte se, že NetMsmqActivator je proces spuštěný a že identita NetMsmqActivator procesu má ve frontě udělené oprávnění ke čtení a hledání.

  2. NetMsmqActivator Pokud monitoruje fronty na vzdáleném počítači, ujistěte se, že NetMsmqActivator se nespustí pod omezeným tokenem. Spuštění NetMsmqActivator s neomezeným tokenem:

    sc sidtype NetMsmqActivator unrestricted
    

Problémy nesouvisely se zabezpečením související s webovým hostitelem: Web hostující aplikaci ve frontě.

Q: Jaký je nejjednodušší způsob přístupu k relacím?

A: Nastavte AutoComplete=true na operaci, která odpovídá poslední zprávě v relaci, a nastavte AutoComplete=false pro všechny zbývající operace služby.

Q: Proč moje služba vyvolá chybu ProtocolException při čtení z fronty, která obsahuje zprávy relace ve frontě i zprávy datagramu ve frontě?

A: Ve způsobu, jakým se zprávy relace ve frontě a zprávy datagramu ve frontě skládají, je zásadní rozdíl. Z tohoto důvodu služba, která očekává čtení zprávy relace ve frontě, nemůže přijmout zprávu datagramu ve frontě a služba, která očekává čtení zprávy datagramu ve frontě, nemůže přijmout zprávu relace. Při pokusu o čtení obou typů zpráv ze stejné fronty dojde k následující výjimce:

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.

Systémová fronta nedoručených zpráv, stejně jako všechny vlastní fronty nedoručených zpráv, jsou k tomuto problému obzvláště náchylné, pokud aplikace odesílá zprávy relace ve frontě i zprávy datagramu ve frontě ze stejného počítače. Pokud zprávu nelze úspěšně odeslat, přesune se do fronty nedoručených zpráv. Za těchto okolností je možné mít zprávy relace i datagramu ve frontě nedoručených zpráv. Při čtení z fronty není žádný způsob, jak oddělit oba typy zpráv za běhu, proto by aplikace neměly odesílat zprávy relace ve frontě ani zprávy datagramu ve frontě ze stejného počítače.

Integrace MSMQ: Konkrétní řešení potíží

Q: Při odeslání zprávy nebo při otevření hostitele služby se zobrazí chyba, která značí, že schéma je chybné. Proč?

A: Při použití integrační vazby MSMQ musíte použít schéma msmq.formatname. Například msmq.formatname:DIRECT=OS:.\private$\OrdersQueue. Pokud ale zadáte vlastní frontu nedoručených zpráv, musíte použít schéma net.msmq.

Q: Když použiju název veřejného nebo privátního formátu a otevřu hostitele služby ve Windows Vista, zobrazí se chyba. Proč?

A: Integrační kanál WCF v systému Windows Vista kontroluje, jestli je možné otevřít podkřesí pro hlavní frontu aplikace pro zpracování zpráv o jedu. Název podkázky je odvozen z identifikátoru URI msmq.formatname předaného do naslouchacího procesu. Název podkřesí v MSMQ může být pouze název přímého formátu. Takže se zobrazí chyba. Změňte identifikátor URI fronty na název přímého formátu.

Q: Při přijímání zprávy z aplikace MSMQ se zpráva nachází ve frontě a není přečtena přijímající aplikací WCF. Proč?

A: Zkontrolujte, jestli zpráva obsahuje text. Pokud zpráva neobsahuje žádné tělo, integrační kanál MSMQ zprávu ignoruje. Implementujte IErrorHandler , abyste byli informováni o výjimkách a kontrolovali trasování.

Q: Když spustím ukázku, která používá výchozí vazbu v režimu pracovní skupiny, zdá se, že se zprávy odesílají, ale příjemce je nikdy nepřijde.

A: Ve výchozím nastavení se zprávy podepisují pomocí interního certifikátu MSMQ, který vyžaduje adresářovou službu Active Directory. V režimu pracovní skupiny není k dispozici služba Active Directory, a proto se podepsání zprávy nezdaří. Zpráva se tak dostane do fronty nedoručených zpráv a je označena příčina selhání, například Chybný podpis.

Alternativním řešením je vypnout zabezpečení. K tomu slouží nastavení Mode = None , aby fungovalo v režimu pracovní skupiny.

Dalším alternativním řešením je získat MsmqTransportSecurity vlastnost z Transport vlastnosti a nastavit ji na Certificatea nastavit klientský certifikát.

Dalším alternativním řešením je instalace MSMQ s integrací služby Active Directory.

Q: Při odeslání zprávy s výchozí vazbou (zapnuté zabezpečení přenosu) ve službě Active Directory do fronty se zobrazí zpráva "Interní certifikát nebyl nalezen". Návody to opravit?

A: To znamená, že certifikát ve službě Active Directory pro odesílatele musí být obnoven. Uděláte to tak, že otevřete Ovládací panely, Nástroje pro správu, Správa počítače, kliknete pravým tlačítkem na MSMQ a vyberete Vlastnosti. Vyberte kartu Uživatelský certifikát a klikněte na tlačítko Obnovit .

Q: Když odešlem zprávu pomocí Certificate a zadám certifikát, který se má použít, zobrazí se zpráva o neplatném certifikátu. Návody to opravit?

A: Úložiště certifikátů místního počítače nelze použít s režimem certifikátu. Pomocí modulu snap-in Certifikát musíte zkopírovat certifikát z úložiště certifikátů počítače do úložiště aktuálního uživatele. Získání modulu snap-in Certifikát:

  1. Klikněte na Start, vyberte Spustit, zadejte mmca klikněte na OK.

  2. V konzole Microsoft Management Console otevřete nabídku Soubor a vyberte Přidat nebo odebrat modul snap-in.

  3. V dialogovém okně Přidat nebo odebrat modul snap-in klikněte na tlačítko Přidat .

  4. V dialogovém okně Přidat samostatný modul snap-in vyberte Certifikáty a klikněte na Přidat.

  5. V dialogovém okně Snap-in Certifikáty vyberte Můj uživatelský účet a klikněte na Dokončit.

  6. Dále přidejte druhý modul snap-in Certifikáty pomocí předchozích kroků, ale tentokrát vyberte Účet počítače a klikněte na Další.

  7. Vyberte položku Místní počítač a klikněte na tlačítko Dokončit. Teď můžete přetahovat certifikáty z úložiště certifikátů počítače do úložiště aktuálního uživatele.

Q: Když moje služba čte z fronty na jiném počítači v režimu pracovní skupiny, zobrazí se výjimka "přístup odepřen".

A: Aby vzdálená aplikace v režimu pracovní skupiny získala přístup k frontě, musí mít oprávnění pro přístup k frontě. Přidejte anonymní přihlášení do seznamu řízení přístupu (ACL) fronty a udělte mu oprávnění ke čtení.

Q: Když klient síťové služby (nebo jakýkoli klient, který nemá účet domény) odešle zprávu ve frontě, odeslání selže s neplatným certifikátem. Návody to opravit?

A: Zkontrolujte konfiguraci vazby. Výchozí vazba má zapnuté zabezpečení přenosu MSMQ pro podepsání zprávy. Vypněte ho.

Vzdálená transacted receives

Q: Pokud mám frontu na počítači A a službu WCF, která čte zprávy z fronty na počítači B (scénář vzdáleného transakčního příjmu), zprávy se z fronty nečtou. Informace o trasování označují, že příjem selhal se zprávou "Transakci nelze importovat". Co můžu udělat, aby se to vyřešilo?

A: Existují tři možné důvody:

  • Pokud jste v režimu domény, vzdálený transakční příjem vyžaduje přístup k síti msdtc (Microsoft Distributed Transaction Coordinator). Tuto možnost můžete povolit pomocí možnosti Přidat nebo odebrat součásti.

    Snímek obrazovky znázorňující povolení síťového přístupu DTC

  • Zkontrolujte režim ověřování pro komunikaci se správcem transakcí. Pokud jste v režimu pracovní skupiny, musí být vybrána možnost Není vyžadováno ověřování. Pokud jste v doménovém režimu, musí být vybrána možnost Vyžaduje se vzájemné ověřování.

    Povolení transakcí XA

  • Ujistěte se, že msdtc je v seznamu výjimek v nastavení brány firewall připojení k internetu .

  • Ujistěte se, že používáte Systém Windows Vista. MSMQ v systému Windows Vista podporuje vzdálené transakční čtení. MSMQ ve starších verzích Windows nepodporuje vzdálené transakční čtení.

Q: Pokud je služba, která čte z fronty, například síťová služba na webovém hostiteli, proč se při čtení z fronty zobrazí výjimka odepření přístupu?

A: Aby bylo zajištěno, že síťová služba bude moct číst z fronty, musí být do seznamu ACL fronty přidán přístup pro čtení síťové služby.

Q: Můžu pomocí aktivační služby MSMQ aktivovat aplikace na základě zpráv ve frontě na vzdáleném počítači?

Odpověď: Ano. Chcete-li to provést, je nutné nakonfigurovat aktivační službu MSMQ tak, aby běžela jako síťová služba, a přidat přístup síťové služby do fronty na vzdáleném počítači.

Použití vlastních vazeb MSMQ s povolenou funkcí ReceiveContext

Při použití vlastní vazby MSMQ s ReceiveContext povolenou se při zpracování příchozí zprávy používá vlákno fondu vláken, protože nativní msmq nepodporuje dokončování vstupně-výstupních operací pro asynchronní ReceiveContext příjem. Důvodem je to, že zpracování takové zprávy používá interní transakce pro ReceiveContext a MSMQ nepodporuje asynchronní zpracování. Pokud chcete tento problém obejít, můžete do koncového bodu přidat SynchronousReceiveBehavior parametr, který vynutí synchronní zpracování, nebo nastavit MaxPendingReceives hodnotu 1.