Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Ukázka msmqActivation ukazuje, jak hostovat aplikace ve službě aktivace procesu systému Windows (WAS), které se čtou z fronty zpráv. Tato ukázka využívá netMsmqBinding a je založená na ukázce Two-Way Communication. Služba v tomto případě je aplikace hostovaná na webu a klient se hostuje sám a výstupuje na konzoli k pozorování stavu odeslaných nákupních objednávek.
Poznámka:
Postup nastavení a pokyny k sestavení pro tuto ukázku najdete na konci tohoto tématu.
Služba aktivace procesů systému Windows (WAS), nový mechanismus aktivace procesu pro Systém Windows Server 2008, poskytuje funkce podobné službě IIS, které byly dříve k dispozici pouze pro aplikace založené na protokolu HTTP pro aplikace, které používají jiné protokoly než HTTP. Technologie Windows Communication Foundation (WCF) používá rozhraní adaptéru naslouchacího programu ke komunikaci požadavků na aktivaci přijatých prostřednictvím ne-HTTP protokolů podporovaných službou WCF, jako jsou TCP, pojmenované kanály a MSMQ. Funkce pro příjem požadavků přes protokoly mimo PROTOKOL HTTP je hostována spravovanými službami Windows spuštěnými v SMSvcHost.exe.
Služba Net.Msmq Listener Adapter (NetMsmqActivator) aktivuje aplikace ve frontě na základě zpráv ve frontě.
Klient odesílá nákupní objednávky do služby v rámci transakce. Služba přijímá objednávky v transakci a zpracovává je. Služba pak zavolá klienta se stavem objednávky. Pro usnadnění obousměrné komunikace klient a služba používají fronty k zařazení nákupních objednávek a stavu objednávky.
Smlouva o službě IOrderProcessor definuje jednosměrné operace, které pracují s frontou. Operace služby používá koncový bod odpovědi k odeslání stavu objednávky klientovi. Adresa odpovědního koncového bodu je URI fronty, která se používá pro vrácení stavu objednávky klientovi. Aplikace pro zpracování objednávek implementuje tento kontrakt.
[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")]
public interface IOrderProcessor
{
[OperationContract(IsOneWay = true)]
void SubmitPurchaseOrder(PurchaseOrder po,
string reportOrderStatusTo);
}
Smlouva pro odpověď, kam zaslat stav objednávky, je určena klientem. Klient implementuje kontrakt stavu objednávky. Služba používá vygenerovaného klienta této smlouvy k odeslání stavu objednávky zpět klientovi.
[ServiceContract]
public interface IOrderStatus
{
[OperationContract(IsOneWay = true)]
void OrderStatus(string poNumber, string status);
}
Služba zpracovává odeslanou nákupní objednávku. Element OperationBehaviorAttribute je použit při operaci služby ke specifikaci automatického zařazení do transakce, která je využita pro přijetí zprávy z fronty a automatickému ukončení transakce po dokončení operace služby. Třída Orders zapouzdřuje funkcionalitu zpracování objednávek. V tomto případě přidá nákupní objednávku do slovníku. Transakce, do které je operace služby zapojena, je dostupná pro operace ve třídě Orders.
Operace služby, kromě zpracování odeslané nákupní objednávky, odpoví zpět klientovi o stavu objednávky.
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();
}
}
}
Klientská vazba, která se má použít, je určena pomocí konfiguračního souboru.
Název fronty MSMQ se zadává v části appSettings konfiguračního souboru. Koncový bod pro službu je definován v části System.serviceModel konfiguračního souboru.
Poznámka:
Název fronty MSMQ a adresa koncového bodu používají mírně odlišné konvence adresování. Název fronty MSMQ používá tečku (.) pro místní počítač a oddělovače zpětného lomítka v jeho cestě. Adresa koncového bodu WCF určuje schéma net.msmq:, pro místní počítač používá "localhost" a v cestě používá dopředná lomítka. Pokud chcete číst z fronty hostované ve vzdáleném počítači, nahraďte "." a "localhost" názvem vzdáleného počítače.
Soubor .svc s názvem třídy slouží k hostování kódu služby v WAS.
Samotný soubor Service.svc obsahuje direktivu pro vytvoření OrderProcessorService.
<%@ServiceHost language="c#" Debug="true" Service="Microsoft.ServiceModel.Samples.OrderProcessorService"%>
Soubor Service.svc obsahuje také direktivu sestavení, která zajistí načtení System.Transactions.dll.
<%@Assembly name="System.Transactions, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"%>
Klient vytvoří obor transakce. Komunikace se službou probíhá v rámci transakce, což způsobuje, že je považována za atomické jednotky, kde všechny zprávy proběhnou úspěšně nebo selžou. Transakce je potvrzena voláním Complete oboru transakce.
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();
}
Klientský kód implementuje IOrderStatus kontrakt pro příjem stavu objednávky ze služby. V tomto případě vytiskne stav objednávky.
[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);
}
}
Fronta stavu objednávky se vytvoří v Main metodě. Konfigurace klienta zahrnuje konfiguraci služby stavu objednávky pro hostování služby stavu objednávky, jak je znázorněno v následující ukázkové konfiguraci.
<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>
Při spuštění ukázky se aktivity klienta a služeb zobrazí v oknech serveru i konzoly klienta. Uvidíte, že server přijímá zprávy od klienta. Stisknutím klávesy ENTER v každém okně konzoly vypnete server a klienta.
Klient zobrazí informace o stavu objednávky odeslané serverem:
Press <ENTER> to terminate client.
Status of order 70cf9d63-3dfa-4e69-81c2-23aa4478ebed :Pending
Jak nastavit, sestavit a spustit ukázku
Ujistěte se, že je nainstalovaná služba IIS 7.0, protože se vyžaduje pro aktivaci WAS.
Ujistěte se, že jste provedli instalační proceduru One-Time pro ukázky Windows Communication Foundation. Kromě toho je nutné nainstalovat komponenty pro aktivaci WCF bez HTTP:
V nabídce Start zvolte Ovládací panely.
Vyberte Programy a funkce.
Klikněte na Zapnout nebo vypnout funkce systému Windows.
V části Souhrn funkcí klikněte na Přidat funkce.
Rozbalte uzel Microsoft .NET Framework 3.0 a zkontrolujte funkci aktivace technologie Windows Communication Foundation bez protokolu HTTP .
Pokud chcete sestavit verzi C# nebo Visual Basic .NET řešení, postupujte podle pokynů v Sestavení ukázek Windows Communication Foundation.
Spusťte klienta spuštěním client.exe z příkazového okna. Tím se vytvoří fronta a odešle se do ní zpráva. Nechejte klienta spuštěný, aby se zobrazil výsledek služby, která zprávu čte.
Aktivační služba MSMQ běží ve výchozím nastavení jako síťová služba. Fronta, která se používá k aktivaci aplikace, proto musí mít oprávnění k příjmu a náhledu pro Síťovou službu. To lze přidat pomocí konzoly MMC služby Řízení front zpráv:
V nabídce Start klepněte na tlačítko Spustit, potom zadejte
Compmgmt.msca stiskněte ENTER.V části Služby a aplikace rozbalte položku Řízení front zpráv.
Klikněte na Soukromé fronty.
Klikněte pravým tlačítkem na frontu (servicemodelsamples/Service.svc) a zvolte Vlastnosti.
Na kartě Zabezpečení klepněte na Přidat a udělte oprávnění pro náhled a přijímání k Síťové službě.
Nakonfigurujte službu aktivace procesu systému Windows (WAS) tak, aby podporovala aktivaci MSMQ.
Následující kroky jsou implementované v dávkovém souboru s názvem AddMsmqSiteBinding.cmd umístěném v ukázkovém adresáři.
Aby bylo možné podporovat aktivaci net.msmq, musí být výchozí web nejprve vázán na protokol net.msmq. To lze provést pomocí appcmd.exe, který je nainstalován se sadou nástrojů pro správu služby IIS 7.0. Z příkazového řádku se zvýšenými oprávněními (správce) spusťte následující příkaz.
%windir%\system32\inetsrv\appcmd.exe set site "Default Web Site" -+bindings.[protocol='net.msmq',bindingInformation='localhost']Poznámka:
Tento příkaz je jeden řádek textu.
Tento příkaz přidá vazbu webu net.msmq na výchozí web.
I když všechny aplikace v rámci webu sdílejí společnou vazbu net.msmq, každá aplikace může povolit podporu net.msmq jednotlivě. Chcete-li povolit net.msmq pro aplikaci /servicemodelsamples, spusťte z příkazového řádku se zvýšenými oprávněními následující příkaz.
%windir%\system32\inetsrv\appcmd.exe set app "Default Web Site/servicemodelsamples" /enabledProtocols:http,net.msmqPoznámka:
Tento příkaz je jeden řádek textu.
Tento příkaz umožňuje přístup k aplikaci /servicemodelsamples pomocí
http://localhost/servicemodelsamplesanet.msmq://localhost/servicemodelsamples.
Pokud jste to ještě neudělali, ujistěte se, že je povolená aktivační služba MSMQ. V nabídce Start klepněte na příkaz Spustit a zadejte
Services.msc. Prohledejte seznam služeb pro Net.Msmq Listener Adapter. Klikněte pravým tlačítkem myši a vyberte Vlastnosti. Nastavte typ spuštění na automaticky, klepněte na tlačítko Použít a klepněte na tlačítko Start . Tento krok je nutné provést pouze jednou před prvním použitím služby Naslouchací adaptér Net.Msmq.Pokud chcete spustit ukázku v konfiguraci s jedním počítačem nebo konfiguraci na více počítačích, postupujte podle pokynů v části Spouštění ukázek Windows Communication Foundation. Kromě toho změňte kód klienta, který odešle nákupní objednávku tak, aby odrážel název počítače v identifikátoru URI fronty při odesílání nákupní objednávky. Použijte následující kód:
client.SubmitPurchaseOrder(po, "net.msmq://localhost/private/ServiceModelSamples/OrderStatus");Odeberte vazbu webu net.msmq, kterou jste přidali pro tento příklad.
Následující kroky se implementují v dávkovém souboru s názvem RemoveMsmqSiteBinding.cmd umístěném v ukázkovém adresáři:
Ze seznamu povolených protokolů odeberte příkaz net.msmq spuštěním následujícího příkazu z příkazového řádku se zvýšenými oprávněními.
%windir%\system32\inetsrv\appcmd.exe set app "Default Web Site/servicemodelsamples" /enabledProtocols:httpPoznámka:
Tento příkaz je jeden řádek textu.
Odeberte vazbu webu net.msmq spuštěním následujícího příkazu z příkazového řádku se zvýšenými oprávněními.
%windir%\system32\inetsrv\appcmd.exe set site "Default Web Site" --bindings.[protocol='net.msmq',bindingInformation='localhost']Poznámka:
Tento příkaz je jeden řádek textu.
Výstraha
Spuštěním dávkového souboru se resetuje defaultAppPool tak, aby běžel pomocí rozhraní .NET Framework verze 2.0.
Ve výchozím nastavení s přenosem vazby netMsmqBinding je povoleno zabezpečení. Dvě vlastnosti MsmqAuthenticationMode a MsmqProtectionLevelspolečně určují typ zabezpečení přenosu. Ve výchozím nastavení je režim ověřování nastaven Windows na a úroveň ochrany je nastavena na Sign. Aby služba MSMQ poskytovala funkci ověřování a podepisování, musí být součástí domény. Pokud tuto ukázku spustíte na počítači, který není součástí domény, zobrazí se následující chyba: "Uživatelský interní certifikát pro fronty zpráv neexistuje".
Ke spuštění ukázky na počítači připojeném k pracovní skupině
Pokud váš počítač není součástí domény, vypněte zabezpečení přenosu nastavením režimu ověřování a úrovně ochrany na žádnou, jak je znázorněno v následující ukázkové konfiguraci.
<bindings> <netMsmqBinding> <binding configurationName="TransactedBinding"> <security mode="None"/> </binding> </netMsmqBinding> </bindings>Před spuštěním ukázky změňte konfiguraci na serveru i klientovi.
Poznámka:
Nastavení
security modeje ekvivalentní nastaveníNone,MsmqAuthenticationModeaMsmqProtectionLevelzabezpečení naMessage.Pokud chcete povolit aktivaci v počítači připojeném k pracovní skupině, musí být aktivační služba i pracovní proces spuštěny s konkrétním uživatelským účtem (musí být stejné pro oba) a fronta musí mít seznamy ACL pro konkrétní uživatelský účet.
Pro změnu identity, pod kterou běží pracovní proces:
Spusťte Inetmgr.exe.
V části Fondy aplikací klikněte pravým tlačítkem na Fond aplikací (obvykle DefaultAppPool) a zvolte Nastavit výchozí hodnoty fondu aplikací....
Změňte vlastnosti identity tak, aby používaly konkrétní uživatelský účet.
Změna identity, pod kterou služba aktivace běží:
Spusťte Services.msc.
Klikněte pravým tlačítkem myši na adaptér Net.MsmqListener a zvolte Vlastnosti.
Změňte účet v záložce LogOn.
V pracovní skupině musí služba běžet také pomocí neomezeného tokenu. Uděláte to tak, že v příkazovém okně spustíte následující příkaz:
sc sidtype netmsmqactivator unrestricted