Aktywacja usługi MSMQ

W przykładzie MsmqActivation pokazano, jak hostować aplikacje w usłudze aktywacji procesów systemu Windows (WAS), które są odczytywane z kolejki komunikatów. W tym przykładzie użyto metody netMsmqBinding i opartej na przykładzie Dwukierunkowa komunikacja . W tym przypadku usługa jest aplikacją hostowaną w sieci Web, a klient jest hostowany samodzielnie i zwraca dane wyjściowe do konsoli w celu obserwowania stanu przesłanych zamówień zakupu.

Uwaga

Procedura instalacji i instrukcje kompilacji dla tego przykładu znajdują się na końcu tego tematu.

Usługa aktywacji procesów systemu Windows (WAS), nowy mechanizm aktywacji procesu dla systemu Windows Server 2008, udostępnia funkcje podobne do usług IIS, które były wcześniej dostępne tylko dla aplikacji opartych na protokole HTTP dla aplikacji korzystających z protokołów innych niż HTTP. Program Windows Communication Foundation (WCF) używa interfejsu adaptera odbiornika do przekazywania żądań aktywacji odbieranych za pośrednictwem protokołów innych niż HTTP obsługiwanych przez program WCF, takich jak TCP, nazwane potoki i MSMQ. Funkcje odbierania żądań za pośrednictwem protokołów innych niż HTTP są hostowane przez zarządzane usługi systemu Windows uruchomione w SMSvcHost.exe.

Usługa Adapter odbiornika Net.Msmq (NetMsmqActivator) aktywuje aplikacje w kolejce na podstawie komunikatów w kolejce.

Klient wysyła zamówienia zakupu do usługi z zakresu transakcji. Usługa otrzymuje zamówienia w transakcji i przetwarza je. Następnie usługa wywołuje klienta ze stanem zamówienia. W celu ułatwienia dwukierunkowej komunikacji klient i usługa używają kolejek do kolejkowania zamówień i stanu zamówienia.

Kontrakt IOrderProcessor usługi definiuje jednokierunkowe operacje usługi, które współpracują z kolejkowaniem. Operacja usługi używa punktu końcowego odpowiedzi do wysyłania stanów zamówień do klienta. Adres punktu końcowego odpowiedzi to identyfikator URI kolejki używanej do wysyłania stanu zamówienia z powrotem do klienta. Aplikacja przetwarzania zamówień implementuje ten kontrakt.

[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")]
public interface IOrderProcessor
{
    [OperationContract(IsOneWay = true)]
    void SubmitPurchaseOrder(PurchaseOrder po,
                                           string reportOrderStatusTo);
}

Kontrakt odpowiedzi do wysyłania stanu zamówienia do jest określony przez klienta. Klient implementuje kontrakt stanu zamówienia. Usługa używa wygenerowanego klienta tego kontraktu do wysyłania stanu zamówienia z powrotem do klienta.

[ServiceContract]
public interface IOrderStatus
{
    [OperationContract(IsOneWay = true)]
    void OrderStatus(string poNumber, string status);
}

Operacja usługi przetwarza przesłane zamówienie zakupu. Element OperationBehaviorAttribute jest stosowany do operacji usługi w celu określenia automatycznej rejestracji w transakcji, która jest używana do odbierania komunikatu z kolejki i automatycznego uzupełniania transakcji po zakończeniu operacji usługi. Klasa Orders hermetyzuje funkcje przetwarzania zamówień. W tym przypadku dodaje zamówienie zakupu do słownika. Transakcja, w ramach którego znajduje się operacja usługi, jest dostępna dla operacji w Orders klasie .

Operacja usługi, oprócz przetwarzania przesłanego zamówienia zakupu, odpowiada z powrotem do klienta o stanie zamówienia.

public class OrderProcessorService : IOrderProcessor
{
    [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
    public void SubmitPurchaseOrder(PurchaseOrder po, string reportOrderStatusTo)
    {
        Orders.Add(po);
        Console.WriteLine("Processing {0} ", po);
        Console.WriteLine("Sending back order status information");
        NetMsmqBinding msmqCallbackBinding = new NetMsmqBinding();
        msmqCallbackBinding.Security.Mode = NetMsmqSecurityMode.None;
        OrderStatusClient client = new OrderStatusClient(msmqCallbackBinding, new EndpointAddress(reportOrderStatusTo));
        // please note that the same transaction that is used to dequeue purchase order is used
        // to send back order status
        using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
        {
            client.OrderStatus(po.PONumber, po.Status);
            scope.Complete();
        }
    }
}

Powiązanie klienta do użycia jest określane przy użyciu pliku konfiguracji.

Nazwa kolejki MSMQ jest określona w sekcji aplikacji Ustawienia pliku konfiguracji. Punkt końcowy usługi jest zdefiniowany w sekcji System.serviceModel pliku konfiguracji.

Uwaga

Nazwa kolejki MSMQ i adres punktu końcowego używają nieco różnych konwencji adresowania. Nazwa kolejki MSMQ używa kropki (.) dla komputera lokalnego i separatorów ukośników odwrotnych w ścieżce. Adres punktu końcowego programu WCF określa net.msmq: scheme, używa "localhost" dla komputera lokalnego i używa ukośników w ścieżce. Aby odczytać z kolejki hostowanej na komputerze zdalnym, zastąp ciąg "." i "localhost" nazwą komputera zdalnego.

Plik svc o nazwie klasy jest używany do hostowania kodu usługi w programie WAS.

Sam plik Service.svc zawiera dyrektywę służącą do utworzenia pliku OrderProcessorService.

<%@ServiceHost language="c#" Debug="true" Service="Microsoft.ServiceModel.Samples.OrderProcessorService"%>

Plik Service.svc zawiera również dyrektywę zestawu, aby upewnić się, że System.Transactions.dll jest załadowana.

<%@Assembly name="System.Transactions, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"%>

Klient tworzy zakres transakcji. Komunikacja z usługą odbywa się w zakresie transakcji, powodując, że jest traktowana jako jednostka niepodzielna, w której wszystkie komunikaty kończą się powodzeniem lub niepowodzeniem. Transakcja jest zatwierdzana przez wywołanie Complete zakresu transakcji.

using (ServiceHost serviceHost = new ServiceHost(typeof(OrderStatusService)))
{
    // Open the ServiceHostBase to create listeners and start listening
    // for order status messages.
    serviceHost.Open();

    // Create a proxy with given client endpoint configuration
    OrderProcessorClient client = new OrderProcessorClient();

    // Create the purchase order
    PurchaseOrder po = new PurchaseOrder();
    po.CustomerId = "somecustomer.com";
    po.PONumber = Guid.NewGuid().ToString();

    PurchaseOrderLineItem lineItem1 = new PurchaseOrderLineItem();
    lineItem1.ProductId = "Blue Widget";
    lineItem1.Quantity = 54;
    lineItem1.UnitCost = 29.99F;

    PurchaseOrderLineItem lineItem2 = new PurchaseOrderLineItem();
    lineItem2.ProductId = "Red Widget";
    lineItem2.Quantity = 890;
    lineItem2.UnitCost = 45.89F;

    po.orderLineItems = new PurchaseOrderLineItem[2];
    po.orderLineItems[0] = lineItem1;
    po.orderLineItems[1] = lineItem2;

    //Create a transaction scope.
    using (TransactionScope scope = new
        TransactionScope(TransactionScopeOption.Required))
    {
        // Make a queued call to submit the purchase order
        client.SubmitPurchaseOrder(po,
       "net.msmq://localhost/private/ServiceModelSamplesOrder/OrderStatus");
        // Complete the transaction.
        scope.Complete();
    }

    //Closing the client gracefully closes the connection and cleans up
    //resources
    client.Close();

    Console.WriteLine();
    Console.WriteLine("Press <ENTER> to terminate client.");
    Console.ReadLine();

    // Close the ServiceHostBase to shutdown the service.
    serviceHost.Close();
    }

Kod klienta implementuje IOrderStatus kontrakt w celu otrzymania stanu zamówienia z usługi. W takim przypadku wyświetla stan zamówienia.

[ServiceBehavior]
public class OrderStatusService : IOrderStatus
{
    [OperationBehavior(TransactionAutoComplete = true,
                        TransactionScopeRequired = true)]
    public void OrderStatus(string poNumber, string status)
    {
        Console.WriteLine("Status of order {0}:{1} ",
                                         poNumber , status);
    }
}

Kolejka stanu zamówienia jest tworzona w metodzie Main . Konfiguracja klienta obejmuje konfigurację usługi stanu zamówienia do hostowania usługi stanu zamówienia, jak pokazano w poniższej przykładowej konfiguracji.

<appSettings>
    <!-- use appSetting to configure MSMQ queue name -->
    <add key="targetQueueName" value=".\private$\ServiceModelSamples/service.svc" />
    <add key="responseQueueName" value=".\private$\ServiceModelSamples/OrderStatus" />
  </appSettings>

<system.serviceModel>

    <services>
      <service
         name="Microsoft.ServiceModel.Samples.OrderStatusService">
        <!-- Define NetMsmqEndpoint -->
        <endpoint address="net.msmq://localhost/private/ServiceModelSamples/OrderStatus"
                  binding="netMsmqBinding"
                  contract="Microsoft.ServiceModel.Samples.IOrderStatus" />
      </service>
    </services>

    <client>
      <!-- Define NetMsmqEndpoint -->
      <endpoint name="OrderProcessorEndpoint"
                address="net.msmq://localhost/private/ServiceModelSamples/service.svc"
                binding="netMsmqBinding"
                contract="Microsoft.ServiceModel.Samples.IOrderProcessor" />
    </client>

  </system.serviceModel>

Po uruchomieniu przykładu działania klienta i usługi są wyświetlane zarówno w oknach konsoli serwera, jak i klienta. Serwer odbiera komunikaty od klienta. Naciśnij klawisz ENTER w każdym oknie konsoli, aby zamknąć serwer i klienta.

Klient wyświetla informacje o stanie zamówienia wysyłane przez serwer:

Press <ENTER> to terminate client.
Status of order 70cf9d63-3dfa-4e69-81c2-23aa4478ebed :Pending

Aby skonfigurować, skompilować i uruchomić przykład

  1. Upewnij się, że usługi IIS 7.0 są zainstalowane, ponieważ jest to wymagane do aktywacji WAS.

  2. Upewnij się, że wykonano procedurę instalacji jednorazowej dla przykładów programu Windows Communication Foundation. Ponadto należy zainstalować składniki aktywacji spoza protokołu HTTP programu WCF:

    1. Z menu Start wybierz pozycję Panel sterowania.

    2. Wybierz pozycję Programy i funkcje.

    3. Kliknij pozycję Włącz lub wyłącz funkcje systemu Windows.

    4. W obszarze Podsumowanie funkcji kliknij pozycję Dodaj funkcje.

    5. Rozwiń węzeł Microsoft .NET Framework 3.0 i sprawdź funkcję Aktywacji nieobsługiwnej przez program Windows Communication Foundation.

  3. Aby skompilować wersję rozwiązania w języku C# lub Visual Basic .NET, postępuj zgodnie z instrukcjami w temacie Building the Windows Communication Foundation Samples (Tworzenie przykładów programu Windows Communication Foundation).

  4. Uruchom klienta, wykonując client.exe z okna poleceń. Spowoduje to utworzenie kolejki i wysłanie do niej komunikatu. Pozostaw klienta uruchomionego, aby zobaczyć wynik usługi odczytu komunikatu

  5. Usługa aktywacji MSMQ jest domyślnie uruchamiana jako usługa sieciowa. W związku z tym kolejka używana do aktywowania aplikacji musi mieć uprawnienia do odbierania i wglądu w usługę sieciową. Można to dodać za pomocą konsoli MMC kolejkowania komunikatów:

    1. W menu Start kliknij pozycję Uruchom, a następnie wpisz Compmgmt.msc i naciśnij klawisz ENTER.

    2. W obszarze Usługi i aplikacje rozwiń węzeł Kolejkowanie komunikatów.

    3. Kliknij pozycję Kolejki prywatne.

    4. Kliknij prawym przyciskiem myszy kolejkę (servicemodelsamples/Service.svc), a następnie wybierz pozycję Właściwości.

    5. Na karcie Zabezpieczenia kliknij pozycję Dodaj i przypisz uprawnienia do usługi sieciowej.

  6. Skonfiguruj usługę aktywacji procesów systemu Windows (WAS), aby obsługiwać aktywację MSMQ.

    Dla wygody następujące kroki są implementowane w pliku wsadowym o nazwie AddMsmqSiteBinding.cmd znajdującym się w przykładowym katalogu.

    1. Aby obsługiwać aktywację net.msmq, domyślna witryna sieci Web musi najpierw być powiązana z protokołem net.msmq. Można to zrobić przy użyciu appcmd.exe, który jest instalowany z zestawem narzędzi zarządzania usług IIS 7.0. W wierszu polecenia z podwyższonym poziomem uprawnień (administrator) uruchom następujące polecenie.

      %windir%\system32\inetsrv\appcmd.exe set site "Default Web Site"
      -+bindings.[protocol='net.msmq',bindingInformation='localhost']
      

      Uwaga

      To polecenie jest pojedynczym wierszem tekstu.

      To polecenie dodaje powiązanie witryny net.msmq do domyślnej witryny sieci Web.

    2. Mimo że wszystkie aplikacje w witrynie współdzielą wspólne powiązanie net.msmq, każda aplikacja może włączyć obsługę net.msmq indywidualnie. Aby włączyć plik net.msmq dla aplikacji /servicemodelsamples, uruchom następujące polecenie w wierszu polecenia z podwyższonym poziomem uprawnień.

      %windir%\system32\inetsrv\appcmd.exe set app "Default Web Site/servicemodelsamples" /enabledProtocols:http,net.msmq
      

      Uwaga

      To polecenie jest pojedynczym wierszem tekstu.

      To polecenie umożliwia dostęp do aplikacji /servicemodelsamples przy użyciu poleceń http://localhost/servicemodelsamples i net.msmq://localhost/servicemodelsamples.

  7. Jeśli jeszcze tego nie zrobiono, upewnij się, że usługa aktywacji MSMQ jest włączona. W menu Start kliknij pozycję Uruchom i wpisz Services.mscpolecenie . Wyszukaj listę usług dla adaptera odbiornika Net.Msmq. Kliknij prawym przyciskiem myszy i wybierz polecenie Właściwości. Ustaw opcję Typ uruchamiania na Automatyczny, kliknij przycisk Zastosuj, a następnie kliknij przycisk Start. Ten krok należy wykonać tylko raz przed pierwszym użyciem usługi Adapter odbiornika Net.Msmq.

  8. Aby uruchomić przykład w konfiguracji pojedynczej lub między komputerami, postępuj zgodnie z instrukcjami w temacie Uruchamianie przykładów programu Windows Communication Foundation. Ponadto zmień kod na kliencie, który przesyła zamówienie zakupu, aby odzwierciedlić nazwę komputera w identyfikatorze URI kolejki podczas przesyłania zamówienia zakupu. Użyj następującego kodu:

    client.SubmitPurchaseOrder(po, "net.msmq://localhost/private/ServiceModelSamples/OrderStatus");
    
  9. Usuń powiązanie witryny net.msmq dodane dla tego przykładu.

    Dla wygody następujące kroki są implementowane w pliku wsadowym o nazwie RemoveMsmqSiteBinding.cmd znajdującym się w przykładowym katalogu:

    1. Usuń plik net.msmq z listy protokołów z obsługą, uruchamiając następujące polecenie w wierszu polecenia z podwyższonym poziomem uprawnień.

      %windir%\system32\inetsrv\appcmd.exe set app "Default Web Site/servicemodelsamples" /enabledProtocols:http
      

      Uwaga

      To polecenie jest pojedynczym wierszem tekstu.

    2. Usuń powiązanie witryny net.msmq, uruchamiając następujące polecenie z wiersza polecenia z podwyższonym poziomem uprawnień.

      %windir%\system32\inetsrv\appcmd.exe set site "Default Web Site" --bindings.[protocol='net.msmq',bindingInformation='localhost']
      

      Uwaga

      To polecenie jest pojedynczym wierszem tekstu.

    Ostrzeżenie

    Uruchomienie pliku wsadowego spowoduje zresetowanie puli DefaultAppPool do uruchomienia przy użyciu programu .NET Framework w wersji 2.0.

Domyślnie w przypadku netMsmqBinding transportu powiązania zabezpieczenia są włączone. Dwie właściwości MsmqAuthenticationMode i MsmqProtectionLevel, razem określają typ zabezpieczeń transportu. Domyślnie tryb uwierzytelniania jest ustawiony na Windows wartość , a poziom ochrony jest ustawiony na Signwartość . Aby usługa MSMQ zapewniała funkcję uwierzytelniania i podpisywania, musi być częścią domeny. Jeśli uruchomisz ten przykład na komputerze, który nie jest częścią domeny, zostanie wyświetlony następujący błąd: "Certyfikat kolejkowania komunikatów wewnętrznych użytkownika nie istnieje".

Aby uruchomić przykład na komputerze przyłączonym do grupy roboczej

  1. Jeśli komputer nie jest częścią domeny, wyłącz zabezpieczenia transportu, ustawiając tryb uwierzytelniania i poziom ochrony na żaden, jak pokazano w poniższej przykładowej konfiguracji.

    <bindings>
        <netMsmqBinding>
            <binding configurationName="TransactedBinding">
                <security mode="None"/>
            </binding>
        </netMsmqBinding>
    </bindings>
    
  2. Przed uruchomieniem przykładu zmień konfigurację zarówno na serwerze, jak i na kliencie.

    Uwaga

    Ustawienie security mode na None jest równoważne ustawieniu MsmqAuthenticationMode, MsmqProtectionLevel i Message zabezpieczeń na None.

  3. Aby włączyć aktywację na komputerze przyłączonym do grupy roboczej, zarówno usługa aktywacji, jak i proces roboczy muszą być uruchamiane przy użyciu określonego konta użytkownika (musi być takie samo dla obu tych elementów), a kolejka musi mieć listy ACL dla określonego konta użytkownika.

    Aby zmienić tożsamość wykonywaną przez proces roboczy w obszarze:

    1. Uruchom Inetmgr.exe.

    2. W obszarze Pule aplikacji kliknij prawym przyciskiem myszy pulę aplikacji (zazwyczaj DefaultAppPool) i wybierz polecenie Ustaw wartości domyślne puli aplikacji....

    3. Zmień właściwości tożsamości, aby używać określonego konta użytkownika.

    Aby zmienić tożsamość uruchomioną przez usługę aktywacji w obszarze:

    1. Uruchom plik Services.msc.

    2. Kliknij prawym przyciskiem myszy adapter Net.MsmqListener, a następnie wybierz polecenie Właściwości.

  4. Zmień konto na karcie LogOn .

  5. W grupie roboczej usługa musi również działać przy użyciu nieograniczonego tokenu. W tym celu uruchom następujące polecenie w oknie polecenia:

    sc sidtype netmsmqactivator unrestricted
    

Zobacz też