2009-11-03 16 views
5

Yazdığım bir Windows hizmetinde barındırılan bir WCF Hizmetim var. PerSession modunda çalışmaktadır. Servis, istemcilerin dosya açmasına, dosyalarda değişiklik yapmasına ve dosyaları uzaktan servis yoluyla kapatmasına izin verir. Şimdiye kadar tüm işler çok sorunsuz.WCF Hizmetini sonlandırın - tüm açık oturumları tamamlayın ve yeni oturumları kısıtlayın

Windows hizmeti durdurulduğunda, WCF Hizmeti'nin yeni oturumları kabul etmesini ve bağlanmış istemcilerin geçerli oturumlarını tamamlamasına ve çalışmasına izin vermesini (makul bir süre/zaman aşımı içinde) elde edebilmeyi istiyorum.

Bunu başarmanın en iyi yolu ne olurdu?

cevap

7

Temel olarak, ServiceHost.Close() numaralı telefonu arayarak bunu gerçekleştirecek - tüm çalışan isteklerinin tamamlanmasına izin verecek, ancak yeni kapatma reddedilirken, kapatma işlemi devam edecek.

Bağlantınızda, hizmetiniz için yapılandırdığınız bir "CloseTimeout" ayarı var; bu, WCF çalışma zamanının ne kadar uzun bir sürenin, düzgün şekilde kapatılana kadar çalışan isteklerin yürütülmesine izin vereceğini denetler. Bu zaman aşımı gerçekleşirse, hala çalışan talepler ölür.

Diğer taraftan, ServiceHost.Abort() yöntemi, bir balyozun dijital eşdeğeridir - tüm çalışan istekleri bir defada sonlandırılır ve ana makine kapatılır.

İstemci tarafında, aynı şekilde davranan istemci proxy'nizde aynı .Close() ve .Abort() yöntemlerine sahipsiniz.

+0

serviceHost.Close hizmeti, hizmetimin istemci bağlantılarını derhal kapatmasına neden oluyor. İstediğim düzenli kapatma yok. Bu davranışı değiştiren bazı yapılandırma var mı? –

+0

@David: Hayır, bunu açmak için herhangi bir ayarın farkında değilim - bu varsayılan davranış olmalı - hala devam eden servis çağrıları düzenli olarak tamamlanmalıdır. Ancak, bu, mevcut oturumları bitene kadar açık tutmaz - herhangi bir servis çağrısı yapılmıyorsa kapatılacaklar. –

+0

@marc_s: Gördüğüm şey ServiceHost.Close'un ServiceHost'un devam etmekte olan servis çağrılarını tamamlamasına izin vermesidir - AMA istemcilerim zaten bir System.ServiceModel.CommunicationException aldı ve yanıtı alamadı. Beklediğiniz bu mu? Herhangi bir geçici çözüm var mı? Yeni servis çağrısı yaparken istemciler bir istisna alırsa iyi olur, ancak ServiceHost.Close çağrıldığında çalışan servis çağrıları, beklenen değerleri müşteriye tamamlayıp geri göndermelidir. –

İlgili konular