Ř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.InvalidOperationException
Adresa 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.ArgumentException
Zá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í.
Ujistěte se, že
NetMsmqActivator
je proces spuštěný a že identitaNetMsmqActivator
procesu má ve frontě udělené oprávnění ke čtení a hledání.NetMsmqActivator
Pokud monitoruje fronty na vzdáleném počítači, ujistěte se, žeNetMsmqActivator
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í.
Řešení potíží s Security-Related
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:
Klikněte na Start, vyberte Spustit, zadejte
mmc
a klikněte na OK.V konzole Microsoft Management Console otevřete nabídku Soubor a vyberte Přidat nebo odebrat modul snap-in.
V dialogovém okně Přidat nebo odebrat modul snap-in klikněte na tlačítko Přidat .
V dialogovém okně Přidat samostatný modul snap-in vyberte Certifikáty a klikněte na Přidat.
V dialogovém okně Snap-in Certifikáty vyberte Můj uživatelský účet a klikněte na Dokončit.
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ší.
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.
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í.
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.