Mesajlaşma etkinlikleri
Mesajlaşma etkinlikleri, iş akışlarının WCF iletileri gönderip almasına olanak tanır. bir iş akışına mesajlaşma etkinlikleri ekleyerek, rastgele karmaşık ileti değişimi desenlerini (MEP) modelleyebilirsiniz.
İleti değişimi desenleri
Üç temel ileti değişimi deseni vardır:
Datagram - Veri birimi MEP'sini kullanırken istemci hizmete bir ileti gönderir, ancak hizmet yanıt vermez. Buna bazen "ateş ve unut" denir. Ateş ve unutma değişimi, bant dışı başarılı teslimat onayı gerektiren bir işlemdir. İleti aktarım sırasında kaybolabilir ve hizmete hiç ulaşmayabilir. İstemci başarıyla bir ileti gönderirse, hizmetin iletiyi aldığını garanti etmez. Veri birimi, mesajlaşma için temel bir yapı taşıdır, bunun üzerine kendi MEP'lerinizi oluşturabilirsiniz.
İstek-Yanıt - İstek yanıtı MEP'ini kullanırken istemci hizmete bir ileti gönderir, hizmet gerekli işlemeyi yapar ve ardından istemciye geri bir yanıt gönderir. Desen, istek-yanıt çiftlerinden oluşur. İstek yanıt çağrılarına örnek olarak uzaktan yordam çağrıları (RPC) ve tarayıcı GET istekleri verilebilir. Bu desen yarı çift yönlü olarak da bilinir.
Çift yönlü - Çift yönlü MEP'i kullanırken istemci ve hizmet herhangi bir sırada birbirlerine ileti gönderebilir. Çift yönlü MEP, konuşulan her sözcüğün bir ileti olduğu bir telefon konuşması gibidir.
Mesajlaşma etkinlikleri, bu temel MEP'lerden herhangi birini ve rastgele karmaşık MEP'leri uygulamanıza olanak sağlar.
Mesajlaşma etkinlikleri
.NET Framework 4.6.1 aşağıdaki mesajlaşma etkinliklerini tanımlar:
SendReply - Alınan iletiye yanıt göndermek için etkinliği kullanın SendReply . Bu etkinlik, bir istek/yanıt MEP'i uygulanırken iş akışı hizmetleri tarafından kullanılır.
ReceiveReply - Yanıt iletisi almak için etkinliği kullanın ReceiveReply . Bu etkinlik, bir istek/yanıt MEP'i uygulanırken iş akışı hizmeti istemcileri tarafından kullanılır.
Mesajlaşma etkinlikleri ve ileti değişimi desenleri
Veri birimi MEP'i, bir istemcinin ileti göndermesini ve iletiyi alan bir hizmeti içerir. İstemci bir iş akışıysa, iletiyi göndermek için bir Send etkinlik kullanın. Bu iletiyi bir iş akışında almak için bir Receive etkinlik kullanın. ve Receive etkinliklerinin Send her birinin adlı Content
bir özelliği vardır. Bu özellik, gönderilen veya alınan verileri içerir. İstek yanıtı MEP'sini uygularken hem istemci hem de hizmet etkinlik çiftlerini kullanır. İstemci, iletiyi göndermek için bir Send etkinlik ve hizmetten yanıt almak için bir ReceiveReply etkinlik kullanır. Bu iki etkinlik özelliği tarafından Request birbiriyle ilişkilendirilir. Bu özellik, özgün iletiyi gönderen etkinliğe ayarlanır Send . Hizmet ayrıca bir çift ilişkili etkinlik de kullanır: Receive ve SendReply. Bu iki etkinlik özelliğiyle Request ilişkilendirilir. Bu özellik, özgün iletiyi alan etkinliğe Receive ayarlanır. ReceiveReply gibi Send ve SendReplyReceive etkinlikleri bir örnek veya ileti sözleşmesi türü göndermenize Message olanak tanır.
İş akışlarının uzun süre çalışan yapısı nedeniyle, çift yönlü iletişim düzeninin uzun süre çalışan konuşmaları da desteklemesi önemlidir. Uzun süre çalışan konuşmaları desteklemek için, konuşmayı başlatan istemcilerin, veriler kullanılabilir olduğunda hizmeti daha sonra geri çağırma fırsatı sağlaması gerekir. Örneğin, yönetici onayı için bir satın alma siparişi isteği gönderilir, ancak bir gün, bir hafta, hatta bir yıl için işlenmeyebilir; satın alma siparişi onayını yöneten iş akışının onay verildikten sonra sürdürülmesi gerektiğini bilmesi gerekir. Bu çift yönlü iletişim deseni, bağıntı kullanan iş akışlarında desteklenir. Çift yönlü desen uygulamak için ve Receive etkinliklerini kullanınSend. etkinliğinde Receive kullanarak CorrelationHandlebir bağıntı başlatın. Bağıntının Send özellik değeri olarak işlediği etkinlik kümesinde CorrelatesWith . Daha fazla bilgi için bkz . Dayanıklı Çift Yönlü.
Not
İş akışının geri çağırma bağıntısı ("Dayanıklı Çift Yönlü") kullanarak çift yönlü uygulaması uzun süre çalışan konuşmalar için tasarlanmıştır. Bu, konuşmanın kısa süre çalıştığı (kanalın ömrü) geri çağırma sözleşmeleriyle WCF çift yönlü ile aynı değildir.
İleti biçimlendirme ve mesajlaşma etkinlikleri
ve ReceiveReply etkinliklerinin Receive adlı Content
bir özelliği vardır. Bu özellik türündedir ReceiveContent ve veya ReceiveReply etkinliğinin Receive aldığı verileri temsil eder. .NET Framework adlı ReceiveMessageContent iki ilişkili sınıfı tanımlar ve ReceiveParametersContent her ikisi de öğesinden ReceiveContenttüretilir. Receive bir iş akışı hizmetine veri almak için veya ReceiveReply etkinliğinin Content
özelliğini bu türlerden birinin bir örneğine ayarlayın. Kullanılacak tür, etkinliğin aldığı veri türüne bağlıdır. Etkinlik bir Message
nesne veya ileti sözleşmesi türü alıyorsa kullanın ReceiveMessageContent. Etkinlik, serileştirilebilen bir veri sözleşmesi veya XML türleri kümesi alırsa kullanın ReceiveParametersContent. ReceiveParametersContent birden çok parametre göndermenizi sağlarken ReceiveMessageContent , yalnızca bir nesne, ileti (veya ileti sözleşmesi türü) göndermenize olanak tanır.
Not
ReceiveMessageContent serileştirilebilen tek bir veri sözleşmesi veya XML türüyle de kullanılabilir. Tek bir parametre ile doğrudan geçirilen ReceiveMessageContent nesne ile kullanımı ReceiveParametersContent arasındaki fark tel biçimidir. Parametrenin içeriği, işlem adına karşılık gelen bir XML öğesinde sarmalanır ve serileştirilmiş nesne parametre adı kullanılarak bir XML öğesinde sarmalanır (örneğin, <Echo><msg>Hello, World</msg></Echo>
). İleti içeriği işlem adına göre sarmalanmaz. Bunun yerine, serileştirilmiş nesne XML nitelenmiş tür adı (örneğin, <string>Hello, World</string>
) kullanılarak bir XML öğesi içine yerleştirilir.
ve SendReply etkinliklerinin Send de adlı Content
bir özelliği vardır. Bu özellik türündedir SendContent ve veya SendReply etkinliğinin Send gönderdiği verileri temsil eder. .NET Framework adlı SendMessageContent iki ilişkili türü tanımlar ve SendParametersContent her ikisi de öğesinden SendContenttüretilir. bir iş akışı hizmetinden Send veri göndermek için veya SendReply etkinliğinin Content
özelliğini bu türlerden birinin bir örneğine ayarlayın. Kullanılacak tür, etkinliğin gönderdiği veri türüne bağlıdır. Etkinlik bir Message
nesne veya ileti sözleşmesi türü gönderiyorsa kullanın SendMessageContent. Etkinlik bir veri sözleşmesi türü gönderirse kullanın SendParametersContent. SendParametersContent birden çok parametre göndermenizi sağlarken SendMessageContent , yalnızca bir nesne, ileti (veya ileti sözleşmesi türü) göndermenize olanak tanır.
Mesajlaşma etkinlikleriyle kesin olarak programlama yaparken, genel InArgument<T> ve OutArgument<T> kullanarak , SendReply, Receiveve ReceiveReply etkinliklerinin ileti veya parametre özelliklerine Sendatadığınız nesneleri sarmalarsınız. ve SendReply etkinlikleri ve Send ve etkinlikleri OutArgument<T> için ReceiveReceiveReply kullanınInArgument<T>. In
bağımsız değişkenleri gönderme etkinlikleriyle birlikte kullanılır çünkü veriler etkinliklere geçirilir. Out
bağımsız değişkenleri, aşağıdaki örnekte gösterildiği gibi veriler etkinliklerden geçirildiği için alma etkinlikleriyle birlikte kullanılır.
Receive reserveSeat = new Receive
{
...
Content = new ReceiveParametersContent
{
Parameters =
{
{ "ReservationInfo", new OutArgument<ReservationRequest>(reservationInfo) }
}
}
};
SendReply reserveSeat = new SendReply
{
...
Request = reserveSeat,
Content = new SendParametersContent
{
Parameters =
{
{ "ReservationId", new InArgument<string>(reservationId) }
}
},
};
Void döndüren bir istek/yanıt işlemi tanımlayan bir iş akışı hizmeti uygularken, aşağıdaki örnekte gösterildiği gibi bir SendReply etkinlik örneği oluşturup özelliği içerik türlerinden birinin (SendMessageContent veya SendParametersContent) boş bir örneğine ayarlamanız Content gerekir.
Receive rcv = new Receive()
{
ServiceContractName = "IService",
OperationName = "NullReturningContract",
Content = new ReceiveParametersContent( new Dictionary<string, OutArgument>() { { "message", new OutArgument<string>() } } )
};
SendReply sr = new SendReply()
{
Request = rcv
Content = new SendParametersContent();
};
Hizmet başvurusu ekleme
Bir iş akışı uygulamasından iş akışı hizmetini çağırırken Visual Studio 2012, bir istek/yanıt MEP'inde kullanılan olağan Send ve ReceiveReply etkinlikleri kapsülleyen özel mesajlaşma etkinlikleri oluşturur. Bu özelliği kullanmak için Visual Studio'da istemci projesine sağ tıklayın ve Hizmet Başvurusu Ekle'yi>seçin. Adres kutusuna hizmetin temel adresini yazın ve Git'e tıklayın. Kullanılabilir hizmetler Hizmetler: kutusunda görüntülenir. Desteklenen sözleşmeleri görüntülemek için hizmet düğümünü genişletin. Çağırmak istediğiniz sözleşmeyi seçtiğinizde kullanılabilir işlemlerin listesi İşlemler kutusunda görüntülenir. Ardından, oluşturulan etkinlik için ad alanını belirtebilir ve Tamam'a tıklayabilirsiniz. Ardından işlemin başarıyla tamamlandığını ve oluşturulan özel etkinliklerin projeyi yeniden oluşturduktan sonra araç kutusunda olduğunu belirten bir iletişim kutusu görürsünüz. Hizmet sözleşmesinde tanımlanan her işlem için bir etkinlik vardır. Projeyi yeniden derledikten sonra özel etkinlikleri iş akışınıza sürükleyip bırakabilir ve özellikler penceresinde gerekli özellikleri ayarlayabilirsiniz.
Mesajlaşma etkinliği şablonları
İstemcide ve hizmette istek/yanıt MEP'i ayarlamayı kolaylaştırmak için Visual Studio 2012 iki mesajlaşma etkinliği şablonu sağlar. System.ServiceModel.Activities.Design.ReceiveAndSendReply
hizmette kullanılır ve System.ServiceModel.Activities.Design.SendAndReceiveReply
istemcide kullanılır. Her iki durumda da şablonlar iş akışınıza uygun mesajlaşma etkinliklerini ekler. hizmette, System.ServiceModel.Activities.Design.ReceiveAndSendReply
bir etkinlik ve ardından bir ReceiveSendReply etkinlik ekler. Request özelliği otomatik olarak etkinliğe Receive ayarlanır. İstemcide, System.ServiceModel.Activities.Design.SendAndReceiveReply
bir Send etkinlik ve ardından bir ReceiveReplyekler. Request özelliği otomatik olarak etkinliğe Send ayarlanır. Bu şablonları kullanmak için uygun şablonu sürükleyip iş akışınıza bırakmanız gerekir.
Mesajlaşma etkinlikleri ve işlemleri
bir iş akışı hizmetine çağrı yapıldığında, hizmet işlemine bir işlem akışı yapmak isteyebilirsiniz. Bunu yapmak için etkinliği bir TransactedReceiveScope etkinliğin Receive içine yerleştirin. Etkinlik TransactedReceiveScope bir Receive
etkinlik ve bir gövde içerir. Hizmete akışı yapılan işlem, gövdesinin TransactedReceiveScopeyürütülmesi boyunca ortam olarak kalır. Gövde yürütmeyi tamamladığında işlem tamamlanır. İş akışları ve işlemler hakkında daha fazla bilgi için bkz. İş Akışı İşlemleri.