Tek Yönlü Hizmetler
Bir hizmet işleminin varsayılan davranışı istek-yanıt desenidir. İstek-yanıt düzeninde, hizmet işlemi kodda bir void
yöntem olarak gösteriliyor olsa bile istemci yanıt iletisini bekler. Tek yönlü bir işlemle yalnızca bir ileti iletilir. Alıcı yanıt iletisi göndermez veya gönderen bir yanıt beklemez.
Tek yönlü tasarım desenini kullanın:
İstemcinin işlemleri çağırması gerektiğinde ve işlem düzeyinde işlemin sonucundan etkilenmediğinde.
veya sınıfını MsmqIntegrationBinding kullanırkenNetMsmqBinding. (Bu senaryo hakkında daha fazla bilgi için bkz. WCF'deki kuyruklar.)
bir işlem tek yönlü olduğunda, hata bilgilerini istemciye geri taşımak için yanıt iletisi yoktur. Hata koşullarını, güvenilir oturumlar gibi temel bağlamanın özelliklerini kullanarak veya iki tek yönlü işlem kullanan bir çift yönlü hizmet sözleşmesi tasarlayarak algılayabilirsiniz: hizmet işlemini çağırmak için istemciden hizmete tek yönlü bir sözleşme ve hizmet ile istemci arasında başka bir tek yönlü sözleşme, böylece hizmet istemcinin uyguladığı bir geri çağırma kullanarak istemciye hata gönderebilir.
Tek yönlü bir hizmet sözleşmesi oluşturmak için, hizmet sözleşmenizi tanımlayın, sınıfı her işleme uygulayın OperationContractAttribute ve aşağıdaki örnek kodda gösterildiği gibi özelliğini true
olarak ayarlayınIsOneWay.
[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")]
public interface IOneWayCalculator
{
[OperationContract(IsOneWay=true)]
void Add(double n1, double n2);
[OperationContract(IsOneWay = true)]
void Subtract(double n1, double n2);
[OperationContract(IsOneWay = true)]
void Multiply(double n1, double n2);
[OperationContract(IsOneWay = true)]
void Divide(double n1, double n2);
}
Tam bir örnek için bkz . Tek Yönlü örnek.
Tek Yönlü İşlemlerle Engelleyen İstemciler
Bazı tek yönlü uygulamaların giden veriler ağ bağlantısına yazılır yazıldıktan hemen sonra döndürülmesine karşın, çeşitli senaryolarda bağlama veya hizmet uygulamasının WCF istemcisinin tek yönlü işlemleri kullanarak engellemesine neden olabileceğinin farkında olmak önemlidir. WCF istemci uygulamalarında, giden veriler ağ bağlantısına yazılana kadar WCF istemci nesnesi döndürülmüyor. Bu, tek yönlü işlemler de dahil olmak üzere tüm ileti değişimi desenleri için geçerlidir; bu, aktarıma veri yazma sorununun istemcinin geri dönmesini engellediği anlamına gelir. Soruna bağlı olarak, sonuç bir özel durum veya hizmete ileti göndermede gecikme olabilir.
Örneğin, aktarım uç noktayı bulamazsa, çok gecikme olmadan bir System.ServiceModel.EndpointNotFoundException özel durum oluşturulur. Ancak, hizmetin bir nedenle verileri kablodan okuyamaması da mümkündür ve bu da istemci taşıma gönderme işleminin döndürülmesini engeller. Bu durumlarda, istemci aktarım bağlaması Binding.SendTimeout üzerindeki süre aşılırsa, zaman aşımı süresi aşılana kadar değil, bir System.TimeoutException oluşturulur. Bir hizmette o kadar çok ileti tetiklenebilir ki, hizmet bunları belirli bir noktadan sonra işleyemez. Bu durumda, tek yönlü istemci de hizmetin iletileri işleyebildiğine veya bir özel durum oluşana kadar engeller.
Başka bir çeşitleme, hizmet ServiceBehaviorAttribute.ConcurrencyMode özelliğinin ayarlandığı Single ve bağlamanın oturumları kullandığı durumdur. Bu durumda, dağıtıcı gelen iletiler üzerinde sıralamayı zorlar (oturum gereksinimi), bu da hizmet bu oturum için önceki iletiyi işleyene kadar sonraki iletilerin ağdan okunmasını engeller. İstemci yine engeller, ancak özel durum oluşu hizmetin istemcideki zaman aşımı ayarlarından önce bekleyen verileri işleyip işleyemediğine bağlıdır.
İstemci nesnesi ile istemci aktarımının gönderme işlemi arasına bir arabellek ekleyerek bu sorunun bir bölümünü azaltabilirsiniz. Örneğin, zaman uyumsuz çağrıları kullanmak veya bellek içi ileti kuyruğu kullanmak istemci nesnesinin hızlı bir şekilde döndürülebilmesini sağlayabilir. Her iki yaklaşım da işlevselliği artırabilir, ancak iş parçacığı havuzunun ve ileti kuyruğunun boyutu yine de sınırları zorunlu tutacaktır.
Bunun yerine hem hizmetteki hem de istemcideki çeşitli denetimleri incelemeniz ve ardından uygulama senaryolarınızı test ederek her iki tarafta da en iyi yapılandırmayı belirlemeniz önerilir. Örneğin, oturumların kullanımı hizmetinizdeki iletilerin işlenmesini engelliyorsa, her iletinin ServiceBehaviorAttribute.InstanceContextMode farklı bir hizmet örneği tarafından işlenebilmesi için PerCall özelliğini olarak ayarlayabilir ve aynı anda birden fazla iş parçacığının ConcurrencyModeMultiple ileti göndermesine izin vermek için öğesini olarak ayarlayabilirsiniz. Bir diğer yaklaşım da hizmetin ve istemci bağlamalarının okuma kotalarını artırmaktır.