Udostępnij za pośrednictwem


Rozwiązywanie problemów obsługi komunikatów kolejek

Ta sekcja zawiera często zadawane pytania i pomoc dotyczącą rozwiązywania problemów dotyczących korzystania z kolejek w programie Windows Communication Foundation (WCF).

Często zadawane pytania

P: Użyto poprawki MSMQ w wersji Beta 1 i zainstalowano ją. Czy muszę usunąć poprawkę?

Odpowiedź: tak. Ta poprawka nie jest już obsługiwana. Program WCF działa teraz na platformie MSMQ bez wymagania dotyczącego poprawki.

P: Istnieją dwa powiązania dla msMQ: NetMsmqBinding i MsmqIntegrationBinding. Czego należy używać i kiedy?

A: Użyj polecenia NetMsmqBinding , jeśli chcesz użyć msMQ jako transportu do komunikacji w kolejce między dwiema aplikacjami WCF. Użyj polecenia MsmqIntegrationBinding , aby używać istniejących aplikacji MSMQ do komunikowania się z nowymi aplikacjami WCF.

P: Czy muszę uaktualnić bibliotekę NetMsmqBinding MSMQ, aby używać powiązań i MsmqIntegration ?

1: Nie. Oba powiązania współpracują z programem MSMQ 3.0 w systemach Windows XP i Windows Server 2003. Niektóre funkcje powiązań stają się dostępne po uaktualnieniu do wersji MSMQ 4.0 w systemie Windows Vista.

P: Jakie funkcje NetMsmqBinding powiązań i MsmqIntegrationBinding są dostępne w programie MSMQ 4.0, ale nie w programie MSMQ 3.0?

A: Następujące funkcje są dostępne w programie MSMQ 4.0, ale nie w programie MSMQ 3.0:

  • Niestandardowa kolejka utraconych wiadomości jest obsługiwana tylko w programie MSMQ 4.0.

  • Programy MSMQ 3.0 i 4.0 obsługują komunikaty o truciznach inaczej.

  • Tylko msMQ 4.0 obsługuje zdalny odczyt transacted.

P: Czy mogę użyć msMQ 3.0 po jednej stronie komunikacji w kolejce i MSMQ 4.0 po drugiej stronie?

Odpowiedź: tak.

P: Chcę zintegrować istniejące aplikacje MSMQ z nowymi klientami lub serwerami WCF. Czy muszę uaktualnić obie strony infrastruktury MSMQ?

1: Nie. Nie trzeba uaktualniać do wersji MSMQ 4.0 po obu stronach.

Rozwiązywanie problemów

Ta sekcja zawiera odpowiedzi na najczęstsze problemy z rozwiązywaniem problemów. Niektóre problemy, które są znane ograniczenia, są również opisane w informacjach o wersji.

P: Próbuję użyć kolejki prywatnej i otrzymuję następujący wyjątek: : System.InvalidOperationExceptionAdres URL jest nieprawidłowy. Adres URL kolejki nie może zawierać znaku "$". Użyj składni w pliku net.msmq://machine/private/queueName, aby rozwiązać problem z kolejką prywatną.

A: Sprawdź identyfikator URI (Uniform Resource Identifier) kolejki w konfiguracji i kodzie. Nie używaj znaku "$" w identyfikatorze URI. Aby na przykład adresować prywatną kolejkę o nazwie OrdersQueue, określ identyfikator URI jako net.msmq://localhost/private/ordersQueue.

P: Wywołanie ServiceHost.Open() w mojej aplikacji w kolejce zgłasza następujący wyjątek: : System.ArgumentExceptionPodstawowy adres nie może zawierać ciągu zapytania identyfikatora URI. Dlaczego?

A: Sprawdź identyfikator URI kolejki w pliku konfiguracji i w kodzie. Podczas gdy kolejki MSMQ obsługują użycie znaku "?", identyfikatory URI interpretują ten znak jako początek zapytania ciągu. Aby uniknąć tego problemu, użyj nazw kolejek, które nie zawierają znaków "?".

P: Moje wysyłanie powiodło się, ale żadna operacja usługi nie jest wywoływana na odbiorniku. Dlaczego?

A: Aby określić odpowiedź, zapoznaj się z następującą listą kontrolną:

  • Sprawdź, czy wymagania dotyczące kolejki transakcyjnej są zgodne z określonymi zabezpieczeniami. Zwróć uwagę na następujące zasady:

    • Trwałe komunikaty (datagramy i sesje) można wysyłać z gwarancjami "dokładnie raz" (ExactlyOnce = true) tylko do kolejki transakcyjnej.

    • Sesje można wysyłać tylko za pomocą gwarancji "dokładnie raz".

    • Transakcja jest wymagana do odbierania komunikatów w sesji z kolejki transakcyjnej.

    • Możesz wysyłać lub odbierać nietrwałe lub trwałe komunikaty (tylko datagramy) bez żadnych gwarancji (ExactlyOnce = false) tylko do kolejki nieakceptacyjnej.

  • Sprawdź kolejkę utraconych wiadomości. Jeśli znajdziesz tam komunikaty, określ, dlaczego nie zostały one dostarczone.

  • Sprawdź kolejki wychodzące pod kątem łączności lub rozwiązywania problemów.

P: Określono niestandardową kolejkę utraconych wiadomości, ale po uruchomieniu aplikacji nadawcy otrzymuję wyjątek, że kolejka utraconych wiadomości nie zostanie znaleziona lub aplikacja wysyłająca nie ma uprawnień do kolejki utraconych wiadomości. Dlaczego tak się dzieje?

A: Niestandardowy identyfikator URI kolejki utraconych wiadomości musi zawierać "localhost" lub nazwę komputera w pierwszym segmencie, na przykład net.msmq://localhost/private/myAppdead-letter.

P: Czy zawsze konieczne jest zdefiniowanie niestandardowej kolejki utraconych wiadomości lub czy istnieje domyślna kolejka utraconych wiadomości?

A: Jeśli gwarancje są "dokładnie raz" (ExactlyOnce = true), a jeśli nie określisz niestandardowej kolejki utraconych listów, wartością domyślną jest kolejka transakcyjna obejmująca całą system.

Jeśli zabezpieczenia nie są żadne (ExactlyOnce = false), wartość domyślna nie jest funkcją kolejki utraconych wiadomości.

P: Moja usługa zgłasza błąd SvcHost.Open z komunikatem "Nie można spełnić wymagań programu EndpointListener przez element ListenerFactory". Dlaczego?

A. Sprawdź kontrakt usługi. Być może zapomniano umieścić ciąg "IsOneWay=true" na wszystkich operacjach usługi. Kolejki obsługują tylko operacje jednokierunkowe.

P: W kolejce znajdują się komunikaty, ale żadna operacja usługi nie jest wywoływana. Na czym polega problem?

A: Ustal, czy host usługi jest uszkodzony. Możesz sprawdzić, przeglądając ślad lub implementując IErrorHandlerelement . Błędy hosta usługi, domyślnie, jeśli zostanie wykryty zatruty komunikat.

P: W kolejce znajdują się komunikaty, ale moja usługa hostowana w kolejce hostowana w sieci Web nie jest aktywowana. Dlaczego?

A: Najczęstszą przyczyną jest uprawnienia.

  1. Upewnij się, że NetMsmqActivator proces jest uruchomiony, a tożsamość NetMsmqActivator procesu ma uprawnienie do odczytu i wyszukiwania w kolejce.

  2. NetMsmqActivator Jeśli kolejki monitorowania są na maszynie zdalnej, upewnij się, że NetMsmqActivator nie działa w ramach tokenu z ograniczeniami. Aby uruchomić element NetMsmqActivator z nieograniczonym tokenem:

    sc sidtype NetMsmqActivator unrestricted
    

W przypadku problemów z hostem sieci Web, które nie są związane z zabezpieczeniami, zobacz: Web Hosting aplikacji w kolejce.

P: Jaki jest najprostszy sposób uzyskiwania dostępu do sesji?

A: Ustaw opcję Autouzupełnianie=true dla operacji odpowiadającej ostatniemu komunikatowi w sesji, a następnie ustaw wartość Autouzupełnianie=false na wszystkich pozostałych operacjach usługi.

P: Dlaczego moja usługa zgłasza błąd ProtocolException podczas odczytywania z kolejki zawierającej zarówno komunikaty sesji w kolejce, jak i komunikaty datagramu w kolejce?

A: Istnieje podstawowa różnica w sposobie komponowania komunikatów sesji w kolejce i komunikatów datagramu w kolejce. W związku z tym usługa, która oczekuje odczytu komunikatu sesji w kolejce, nie może odebrać komunikatu datagramu w kolejce, a usługa oczekująca odczytania komunikatu datagramu w kolejce nie może odebrać komunikatu sesji. Próba odczytania obu typów komunikatów z tej samej kolejki zgłasza następujący wyjątek:

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.

Kolejka utraconych komunikatów systemowych, a także dowolna niestandardowa kolejka utraconych wiadomości, jest szczególnie podatna na ten problem, jeśli aplikacja wysyła zarówno komunikaty sesji w kolejce, jak i komunikaty datagramu w kolejce z tego samego komputera. Jeśli nie można pomyślnie wysłać wiadomości, zostanie ona przeniesiona do kolejki utraconych wiadomości. W takich okolicznościach można mieć zarówno komunikaty sesji, jak i datagramu w kolejce utraconych wiadomości. Nie ma możliwości oddzielenia obu typów komunikatów w czasie wykonywania podczas odczytywania z kolejki, dlatego aplikacje nie powinny wysyłać zarówno komunikatów sesji w kolejce, jak i komunikatów datagramu w kolejce z tego samego komputera.

Integracja msMQ: konkretne rozwiązywanie problemów

P: Po wysłaniu komunikatu lub otwarciu hosta usługi występuje błąd wskazujący, że schemat jest nieprawidłowy. Dlaczego?

A: W przypadku korzystania z powiązania integracji MSMQ należy użyć schematu msmq.formatname. Na przykład msmq.formatname:DIRECT=OS:.\private$\OrdersQueue. Jednak po określeniu niestandardowej kolejki utraconych wiadomości należy użyć schematu net.msmq.

P: Gdy używam nazwy formatu publicznego lub prywatnego i otwieram hosta usługi w systemie Windows Vista, otrzymuję błąd. Dlaczego?

A: Kanał integracji programu WCF w systemie Windows Vista sprawdza, czy można otworzyć pod kolejkę głównej aplikacji do obsługi komunikatów otrutych. Nazwa kolejki podrzędnej pochodzi z identyfikatora URI msmq.formatname przekazanego do odbiornika. Nazwa kolejki podrzędnej w msMQ może być tylko nazwą formatu bezpośredniego. Zostanie wyświetlony błąd. Zmień identyfikator URI kolejki na nazwę formatu bezpośredniego.

P: Podczas odbierania komunikatu z aplikacji MSMQ komunikat znajduje się w kolejce i nie jest odczytywany przez odbieraną aplikację WCF. Dlaczego?

A: Sprawdź, czy komunikat ma treść. Jeśli komunikat nie ma treści, kanał integracji MSMQ ignoruje komunikat. Zaimplementuj IErrorHandler , aby otrzymywać powiadomienia o wyjątkach i sprawdzać ślady.

P: Po uruchomieniu przykładu, który używa domyślnego powiązania w trybie grupy roboczej, komunikaty wydają się być wysyłane, ale nigdy nie są odbierane przez odbiorcę.

A: Domyślnie komunikaty są podpisane przy użyciu wewnętrznego certyfikatu MSMQ, który wymaga usługi katalogowej Active Directory. W trybie grupy roboczej, ponieważ usługa Active Directory jest niedostępna, podpisywanie komunikatu kończy się niepowodzeniem. Dlatego komunikat ląduje w kolejce utraconych listów i przyczynach awarii, takich jak "Nieprawidłowy podpis", jest wskazywany.

Obejście polega na wyłączeniu zabezpieczeń. Jest to wykonywane przez ustawienie Mode = None , aby działało w trybie grupy roboczej.

Innym obejściem jest pobranie MsmqTransportSecurity właściwości z Transport właściwości i ustawienie jej na Certificate, a następnie ustawienie certyfikatu klienta.

Innym obejściem jest zainstalowanie pakietu MSMQ z integracją usługi Active Directory.

P: Gdy wysyłam komunikat z domyślnym powiązaniem (zabezpieczenia transportu włączone) w usłudze Active Directory do kolejki, otrzymuję komunikat "Nie znaleziono certyfikatu wewnętrznego". Jak mogę rozwiązać ten problem?

A: Oznacza to, że certyfikat w usłudze Active Directory dla nadawcy musi zostać odnowiony. W tym celu otwórz Panel sterowania, narzędzia administracyjne, zarządzanie komputerem, kliknij prawym przyciskiem myszy pozycję MSMQ i wybierz pozycję Właściwości. Wybierz kartę Certyfikat użytkownika i kliknij przycisk Odnów .

P: Po wysłaniu komunikatu przy użyciu Certificate polecenia i określeniu certyfikatu do użycia otrzymuję komunikat "Nieprawidłowy certyfikat". Jak mogę rozwiązać ten problem?

A: Nie można użyć magazynu certyfikatów komputera lokalnego z trybem certyfikatu. Należy skopiować certyfikat z magazynu certyfikatów komputera do bieżącego magazynu użytkowników przy użyciu przystawki Certyfikat. Aby pobrać przystawkę Certyfikat:

  1. Kliknij przycisk Start, wybierz pozycję Uruchom, wpisz mmc, a następnie kliknij przycisk OK.

  2. W konsoli zarządzania firmy Microsoft otwórz menu Plik i wybierz pozycję Dodaj/Usuń przystawkę.

  3. W oknie dialogowym Dodawanie/usuwanie przystawki kliknij przycisk Dodaj .

  4. W oknie dialogowym Dodawanie autonomicznej przystawki wybierz pozycję Certyfikaty i kliknij przycisk Dodaj.

  5. W oknie dialogowym Przystawka Certyfikaty wybierz pozycję Moje konto użytkownika, a następnie kliknij przycisk Zakończ.

  6. Następnie dodaj drugą przystawkę Certyfikaty przy użyciu poprzednich kroków, ale tym razem wybierz pozycję Konto komputera i kliknij przycisk Dalej.

  7. Wybierz pozycję Komputer lokalny i kliknij przycisk Zakończ. Teraz można przeciągać i upuszczać certyfikaty z magazynu certyfikatów komputera do bieżącego magazynu użytkowników.

P: Gdy moja usługa odczytuje z kolejki na innym komputerze w trybie grupy roboczej, otrzymuję wyjątek "odmowa dostępu".

A: W trybie grupy roboczej, aby aplikacja zdalna mogła uzyskać dostęp do kolejki, aplikacja musi mieć uprawnienia dostępu do kolejki. Dodaj pozycję "Logowanie anonimowe" do listy kontroli dostępu do kolejki (ACL) i nadaj jej uprawnienie do odczytu.

P: Gdy klient usługi sieciowej (lub dowolny klient, który nie ma konta domeny) wysyła komunikat w kolejce, wysyłanie kończy się niepowodzeniem z nieprawidłowym certyfikatem. Jak mogę rozwiązać ten problem?

A: Sprawdź konfigurację powiązania. Domyślne powiązanie ma włączone zabezpieczenia transportu MSMQ, aby podpisać komunikat. Wyłącz tę funkcję.

Odbierane zdalnego transakcji

P: Gdy mam kolejkę na maszynie A i usługę WCF, która odczytuje komunikaty z kolejki na maszynie B (zdalny scenariusz transacted odbierania), komunikaty nie są odczytywane z kolejki. Informacje śledzenia wskazują, że odbieranie nie powiodło się z komunikatem "Nie można zaimportować transakcji". Co mogę zrobić, aby rozwiązać ten problem?

A: Istnieją trzy możliwe przyczyny tego:

  • Jeśli jesteś w trybie domeny, zdalne odbieranie transakcji wymaga dostępu do sieci programu Microsoft Distributed Transaction Coordinator (MSDTC). Można to włączyć za pomocą polecenia Dodaj/Usuń składniki.

    Zrzut ekranu przedstawiający włączanie dostępu do sieci DTC.

  • Sprawdź tryb uwierzytelniania, aby komunikować się z menedżerem transakcji. Jeśli jesteś w trybie grupy roboczej, należy wybrać opcję "Brak wymaganego uwierzytelniania". Jeśli jesteś w trybie domeny, należy wybrać opcję "Wymagane wzajemne uwierzytelnianie".

    Włączanie transakcji XA

  • Upewnij się, że witryna MSDTC znajduje się na liście wyjątków w ustawieniach zapory połączenia internetowego .

  • Upewnij się, że używasz systemu Windows Vista. Funkcja MSMQ w systemie Windows Vista obsługuje zdalny odczyt transacted. Funkcja MSMQ we wcześniejszych wersjach systemu Windows nie obsługuje zdalnego odczytu transakcyjnego.

P: Kiedy usługa odczytu z kolejki jest usługą sieciową, na przykład na hoście sieci Web, dlaczego otrzymuję wyjątek odmowy dostępu jest zgłaszany podczas odczytywania z kolejki?

A: Aby usługa sieciowa mogła odczytać z kolejki, należy dodać dostęp do listy ACL kolejki, aby usługa sieciowa mogła odczytywać z kolejki.

P: Czy mogę użyć usługi aktywacji MSMQ do aktywowania aplikacji na podstawie komunikatów w kolejce na maszynie zdalnej?

Odpowiedź: tak. W tym celu należy skonfigurować usługę aktywacji MSMQ do uruchamiania jako usługi sieciowej i dodać dostęp do usługi sieciowej do kolejki na maszynie zdalnej.

Używanie niestandardowych powiązań MSMQ z włączoną funkcją ReceiveContext

W przypadku korzystania z niestandardowego powiązania MSMQ z ReceiveContext włączoną obsługą przetwarzanie komunikatu przychodzącego używa wątku puli wątków, ponieważ natywna funkcja MSMQ nie obsługuje uzupełniania we/wy na potrzeby odbierania asynchronicznego ReceiveContext . Jest to spowodowane tym, że przetwarzanie takiego komunikatu używa transakcji wewnętrznych dla ReceiveContext , a usługa MSMQ nie obsługuje przetwarzania asynchronicznego. Aby obejść ten problem, możesz dodać element SynchronousReceiveBehavior do punktu końcowego, aby wymusić przetwarzanie synchroniczne lub ustawić wartość MaxPendingReceives 1.