MSMQ-aktiválás

Az MsmqActivation minta bemutatja, hogyan üzemeltethetők az üzenetsorból beolvasott alkalmazások a Windows Folyamataktiválási szolgáltatásban (WAS). Ez a minta a netMsmqBinding és a Two-Way Kommunikáció mintán alapul. Ebben az esetben a szolgáltatás egy webre üzemeltetett alkalmazás, és az ügyfél saját üzemeltetésű, és a konzolon kimeneteket ad ki, hogy megfigyelje az elküldött megrendelések állapotát.

Megjegyzés:

A minta telepítési eljárása és összeállítási utasításai a témakör végén találhatók.

A Windows Server 2008 új folyamataktiválási mechanizmusa, a Windows Process Activation Service (WAS) olyan IIS-szerű funkciókat biztosít, amelyek korábban csak a HTTP-alapú alkalmazások számára voltak elérhetők a nem HTTP protokollokat használó alkalmazások számára. A Windows Communication Foundation (WCF) a figyelőadapter-adapterrel kommunikálja a WCF által támogatott nem HTTP protokollokon keresztül fogadott aktiválási kérelmeket, például a TCP-t, a Named Pipeset és az MSMQ-t. A nem HTTP protokollokon keresztül érkező kérelmek fogadásának funkcióit a SMSvcHost.exefutó felügyelt Windows-szolgáltatások üzemeltetik.

A Net.Msmq figyelőadapter szolgáltatás (NetMsmqActivator) az üzenetsor üzenetei alapján aktiválja a várólistán lévő alkalmazásokat.

Az ügyfél beszerzési rendeléseket küld a szolgáltatásnak egy tranzakció hatókörén belülről. A szolgáltatás megkapja a rendeléseket egy tranzakcióban, és feldolgozza őket. A szolgáltatás ezután visszahívja az ügyfelet a rendelés állapotával. A kétirányú kommunikáció megkönnyítése érdekében az ügyfél és a szolgáltatás egyaránt üzenetsorokat használ a beszerzési rendelések és a megrendelések állapotának lekérdezéséhez.

A szolgáltatási szerződés IOrderProcessor határozza meg az egyirányú szolgáltatásműveleteket, amelyek a sorba állítással működnek. A szolgáltatásművelet a válaszvégpont használatával küldi el a rendelés állapotát az ügyfélnek. A válaszvégpont címe annak az üzenetsornak az URI-ja, amelyet a rendelés állapotának az ügyfél számára történő visszaküldésére használnak. A rendelésfeldolgozó alkalmazás implementálja ezt a szerződést.

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

A rendelés állapotának elküldésére vonatkozó válaszszerződést az ügyfél határozza meg. Az ügyfél végrehajtja a rendelésállapot-szerződést. A szolgáltatás a szerződés által generált klienssel az ügyfélnek küldi vissza a rendelés állapotát.

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

A szolgáltatásművelet feldolgozza a beküldött beszerzési rendelést. A OperationBehaviorAttribute rendszer a szolgáltatásműveletre alkalmazza az üzenet üzenetsorból való fogadásához használt tranzakció automatikus beléptetésének megadására, valamint a tranzakció automatikus befejezésére a szolgáltatásművelet befejezésekor. Az Orders osztály a rendelésfeldolgozási funkciókat foglalja magában. Ebben az esetben hozzáadja a vásárlási rendelést egy szótárhoz. Az a tranzakció, amelyben a szolgáltatásművelet szerepel, elérhető az Orders osztály műveletei számára.

A szolgáltatásművelet a beküldött megrendelés feldolgozása mellett válaszol az ügyfélnek a rendelés állapotáról.

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();
        }
    }
}

A használni kívánt ügyfélkötés konfigurációs fájllal van megadva.

Az MSMQ-üzenetsor neve a konfigurációs fájl AppSettings szakaszában van megadva. A szolgáltatás végpontja a konfigurációs fájl System.serviceModel szakaszában van definiálva.

Megjegyzés:

Az MSMQ-üzenetsor neve és végpontcíme némileg eltérő címzési konvenciókban szerepel. Az MSMQ-üzenetsor neve egy pont (.) karaktert használ a helyi számítógép megadására, és fordított perjelelválasztókat az elérési útvonalban. A WCF végpont címe net.msmq: sémát használ, a "localhost" nevet használja a helyi számítógéphez, és perjeleket alkalmaz az útvonalban. Ha a távoli számítógépen üzemeltetett üzenetsorokból szeretne olvasni, cserélje le a '.' és a 'localhost' kifejezést a távoli számítógép nevére.

Az osztály nevével ellátott .svc fájl a WAS szolgáltatáskódjának üzemeltetésére szolgál.

A Service.svc fájl maga tartalmaz egy direktívát a OrderProcessorService létrehozására.

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

A Service.svc fájl tartalmaz egy összeállítási irányelvet is, amely biztosítja, hogy a System.Transactions.dll betöltve legyen.

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

Az ügyfél létrehoz egy tranzakciós hatókört. A szolgáltatással való kommunikáció a tranzakció hatókörén belül történik, ezért atomi egységként kell kezelni, ahol minden üzenet sikeres vagy sikertelen. A tranzakció véglegesítése a tranzakció hatókörének meghívásával Complete történik.

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();
    }

Az ügyfélkód megvalósítja a IOrderStatus szerződést, hogy megkapja a rendelés állapotát a szolgáltatástól. Ebben az esetben kinyomtatja a rendelés állapotát.

[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);
    }
}

A rendszer létrehozza a rendelési állapotsort a Main metódusban. Az ügyfélkonfiguráció tartalmazza a rendelésállapot-szolgáltatás konfigurációját a rendelésállapot-szolgáltatás üzemeltetéséhez, ahogyan az az alábbi mintakonfigurációban látható.

<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>

A minta futtatásakor az ügyfél- és szolgáltatástevékenységek a kiszolgáló és az ügyfélkonzol ablakaiban is megjelennek. Láthatja, hogy a kiszolgáló üzeneteket fogad az ügyféltől. A kiszolgáló és az ügyfél leállításához nyomja le az ENTER billentyűt az egyes konzolablakokban.

Az ügyfél megjeleníti a kiszolgáló által küldött rendelési állapotadatokat:

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

A példa beállítása, elkészítése és futtatása

  1. Győződjön meg arról, hogy az IIS 7.0 telepítve van, mivel az a WAS aktiválásához szükséges.

  2. Győződjön meg arról, hogy elvégezte a Windows Communication Foundation-minták One-Time beállítási eljárását. Emellett telepítenie kell a WCF nem HTTP-aktiválási összetevőit:

    1. A Start menüben válassza a Vezérlőpult lehetőséget.

    2. Válassza a Programok és szolgáltatások lehetőséget.

    3. Kattintson a Windows-szolgáltatások be- és kikapcsolása gombra.

    4. A Szolgáltatások összegzése csoportban kattintson a Szolgáltatások hozzáadása elemre.

    5. Bontsa ki a Microsoft .NET Framework 3.0 csomópontot, és ellenőrizze a Windows Communication Foundation nem HTTP aktiválási funkcióját.

  3. A megoldás C# vagy Visual Basic .NET kiadásának létrehozásához kövesse Windows Communication Foundation-mintákcímű témakör utasításait.

  4. Futtassa az ügyfelet a client.exe parancs végrehajtásával parancsablakból. Ezzel létrehozza az üzenetsort, és üzenetet küld neki. Hagyja futni a klienst, hogy megtekinthesse az üzenetet olvasó szolgáltatás eredményét.

  5. Az MSMQ aktiválási szolgáltatás alapértelmezés szerint hálózati szolgáltatásként fut. Ezért a sor, amelyet az alkalmazás aktiválására használnak, rendelkeznie kell fogadási és betekintési engedélyekkel a Network Service számára. Ez a Message Queuing MMC használatával adható hozzá:

    1. A Start menüben kattintson a Futtatás gombra, majd írja be Compmgmt.msc és nyomja le az ENTER billentyűt.

    2. A Szolgáltatások és alkalmazások területen bontsa ki a Message Queuing elemet.

    3. Kattintson a Privát üzenetsorok elemre.

    4. Kattintson a jobb gombbal az üzenetsorra (servicemodelsamples/Service.svc), és válassza a Tulajdonságok lehetőséget.

    5. A Biztonság lapon kattintson a Hozzáadás gombra, és adjon betekintést, és kapjon engedélyeket a Hálózati szolgáltatáshoz.

  6. Konfigurálja a Windows Folyamataktiválási szolgáltatást (WAS) az MSMQ aktiválásának támogatásához.

    A következő lépések a mintakönyvtárban található AddMsmqSiteBinding.cmd nevű kötegfájlban implementálódnak.

    1. A net.msmq aktiválás támogatásához az alapértelmezett webhelyet először a net.msmq protokollhoz kell kötni. Ez az IIS 7.0 felügyeleti eszközkészlettel telepített appcmd.exehasználatával végezhető el. Rendszergazdai jogú parancssorból futtassa a következő parancsot.

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

      Megjegyzés:

      Ez a parancs egyetlen sornyi szöveg.

      Ez a parancs egy net.msmq webhelykötést ad hozzá az alapértelmezett webhelyhez.

    2. Bár a webhely összes alkalmazása közös net.msmq kötéssel rendelkezik, minden alkalmazás egyenként engedélyezheti a net.msmq támogatását. Ha engedélyezni szeretné a net.msmq parancsot a /servicemodelsamples alkalmazáshoz, futtassa a következő parancsot egy emelt szintű parancssorból.

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

      Megjegyzés:

      Ez a parancs egyetlen sornyi szöveg.

      Ez a parancs engedi a /servicemodelsamples alkalmazás elérését http://localhost/servicemodelsamples és net.msmq://localhost/servicemodelsamples.

  7. Ha korábban még nem tette meg, győződjön meg arról, hogy az MSMQ aktiválási szolgáltatás engedélyezve van. A Start menüben kattintson a Futtatás gombra, és írja be a kívánt parancsot Services.msc. Keressen rá a Net.Msmq figyelőadapter szolgáltatásainak listájára. Kattintson a jobb gombbal, és válassza a Tulajdonságok parancsot. Állítsa az indítási típustautomatikusra, kattintson az Alkalmaz gombra, majd a Start gombra. Ezt a lépést csak egyszer kell elvégezni a Net.Msmq figyelőadapter szolgáltatás első használata előtt.

  8. Ha a mintát egy- vagy számítógépközi konfigurációban szeretné futtatni, kövesse a Windows Communication Foundation-minták futtatásával kapcsolatos utasításokat. Emellett módosítsa a vásárlási rendelést beküldő ügyfél kódját, hogy tükrözze a számítógép nevét az üzenetsor URI-jában a vásárlási megrendelés elküldésekor. Használja a következő kódot:

    client.SubmitPurchaseOrder(po, "net.msmq://localhost/private/ServiceModelSamples/OrderStatus");
    
  9. Távolítsa el a mintához hozzáadott net.msmq webhelykötést.

    A következő lépéseket a mintakönyvtárban található RemoveMsmqSiteBinding.cmd nevű kötegfájlban hajtja végre:

    1. Távolítsa el a net.msmq-t az engedélyezett protokollok listájából az alábbi parancs rendszergazda jogú parancssorból való futtatásával.

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

      Megjegyzés:

      Ez a parancs egyetlen sornyi szöveg.

    2. Távolítsa el a net.msmq webhelykötést az alábbi parancs rendszergazda jogú parancssorból való futtatásával.

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

      Megjegyzés:

      Ez a parancs egyetlen sornyi szöveg.

    Figyelmeztetés

    A kötegfájl futtatása visszaállítja a DefaultAppPoolt a .NET-keretrendszer 2.0-s verziójával való futtatásra.

Alapértelmezés szerint a netMsmqBinding kötés átvitelével a biztonság engedélyezve van. Két tulajdonság, MsmqAuthenticationMode és MsmqProtectionLevelegyütt határozza meg az átviteli biztonság típusát. Alapértelmezés szerint a hitelesítési mód be van állítva, Windows a védelmi szint pedig a következőre Signvan állítva. Ahhoz, hogy az MSMQ biztosítsa a hitelesítési és aláírási funkciót, annak tartományhoz kell tartoznia. Ha olyan számítógépen futtatja ezt a mintát, amely nem része tartománynak, a következő hibaüzenet jelenik meg: "A felhasználó belső üzenetsor-kezelési tanúsítványa nem létezik".

A minta futtatása munkacsoporthoz csatlakoztatott számítógépen

  1. Ha a számítógép nem része tartománynak, kapcsolja ki az átviteli biztonságot úgy, hogy a hitelesítési módot és a védelmi szintet egyikre sem állítja be az alábbi mintakonfigurációban látható módon.

    <bindings>
        <netMsmqBinding>
            <binding configurationName="TransactedBinding">
                <security mode="None"/>
            </binding>
        </netMsmqBinding>
    </bindings>
    
  2. A minta futtatása előtt módosítsa a konfigurációt a kiszolgálón és az ügyfélen is.

    Megjegyzés:

    A(z) security mode beállítása None egyenértékű azzal, ha a MsmqAuthenticationMode, MsmqProtectionLevel és Message biztonsági beállítást None-ra módosítjuk.

  3. Ha engedélyezni szeretné az aktiválást egy munkacsoporthoz csatlakoztatott számítógépen, az aktiválási szolgáltatásnak és a feldolgozó folyamatnak is egy adott felhasználói fiókkal kell futnia (mindkettő esetében azonosnak kell lennie), és az üzenetsornak ACL-ekkel kell rendelkeznie az adott felhasználói fiókhoz.

    A feldolgozói folyamat által használt identitás módosítása:

    1. Futtassa a Inetmgr.exe.

    2. Az Alkalmazáskészletek csoportban kattintson a jobb gombbal az AppPoolra (általában DefaultAppPool), és válassza az Alkalmazáskészlet alapértelmezett értékének beállítása...parancsot.

    3. Módosítsa az identitástulajdonságokat az adott felhasználói fiók használatára.

    Az aktiválási szolgáltatás futásához használt identitás módosítása:

    1. Futtassa a Services.msc parancsot.

    2. Kattintson a jobb gombbal a Net.MsmqListener adapterre, és válassza a Tulajdonságok parancsot.

  4. Módosítsa a fiókot a Bejelentkezés lapon.

  5. Munkacsoportban a szolgáltatásnak futnia kell korlátlan jogosultságú token használatával is. Ehhez futtassa a következőket egy parancsablakban:

    sc sidtype netmsmqactivator unrestricted
    

Lásd még