Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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
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.
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:
A Start menüben válassza a Vezérlőpult lehetőséget.
Válassza a Programok és szolgáltatások lehetőséget.
Kattintson a Windows-szolgáltatások be- és kikapcsolása gombra.
A Szolgáltatások összegzése csoportban kattintson a Szolgáltatások hozzáadása elemre.
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.
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.
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.
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á:
A Start menüben kattintson a Futtatás gombra, majd írja be
Compmgmt.mscés nyomja le az ENTER billentyűt.A Szolgáltatások és alkalmazások területen bontsa ki a Message Queuing elemet.
Kattintson a Privát üzenetsorok elemre.
Kattintson a jobb gombbal az üzenetsorra (servicemodelsamples/Service.svc), és válassza a Tulajdonságok lehetőséget.
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.
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.
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.
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.msmqMegjegyzés:
Ez a parancs egyetlen sornyi szöveg.
Ez a parancs engedi a /servicemodelsamples alkalmazás elérését
http://localhost/servicemodelsamplesésnet.msmq://localhost/servicemodelsamples.
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.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");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:
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:httpMegjegyzés:
Ez a parancs egyetlen sornyi szöveg.
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
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>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 modebeállításaNoneegyenértékű azzal, ha aMsmqAuthenticationMode,MsmqProtectionLevelésMessagebiztonsági beállítástNone-ra módosítjuk.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:
Futtassa a Inetmgr.exe.
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.
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:
Futtassa a Services.msc parancsot.
Kattintson a jobb gombbal a Net.MsmqListener adapterre, és válassza a Tulajdonságok parancsot.
Módosítsa a fiókot a Bejelentkezés lapon.
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