WCF

2009-08-06 12 views
14

'da bir CommunicationObjectFaultedException öğesinden kurtarma WCF web hizmeti üzerinden bir ileti göndermek için her 10 saniyede bir istemci uygulaması var. Bu istemci uygulaması, sivil internet bağlantısına sahip olacağımızı bildiğimiz bir gemideki bir bilgisayarda olacak. Uygulamanın servis yoluyla veri göndermeyi denemesini ve mesaj gönderilemediğini, mesajların gönderilmesini sağlayarak hizmetin gönderilmesini sağlayın.WCF

Bu kurulumu sınamak için istemci uygulamasını ve web hizmetini (her ikisi de yerel makinemde) başlatıyorum ve her şey iyi çalışıyor. İnternet servisini öldürerek ve yeniden başlatarak kötü internet bağlantısını simüle etmeye çalışıyorum. Hizmeti öldürdüğümde, CommunicationObjectFaultedExceptions almaya başlıyorum - bu beklenen. Ancak hizmeti yeniden başlattıktan sonra bu istisnaları almaya devam ediyorum.

Web servis paradigması hakkında anlamadığım bir şey olduğunu gayet eminim, ancak bunun ne olduğunu bilmiyorum. Bu kurulumun uygun olup olmadığına dair herhangi bir tavsiye verilebilir mi ve eğer öyleyse, bu sorunun nasıl çözüleceği (yani, iletişim kanalını web servisiyle yeniden nasıl kurulacağı)?

Teşekkürler! onlar hatalı bir kez

Klay

cevap

33

Müşteri hizmet vekiller yeniden kullanılamaz. Eski olanı atmalı ve yeni bir tane yaratmalısın.

Ayrıca, istemci hizmet proxy'sini düzgün şekilde kapattığınızdan emin olmalısınız. Bir WCF servis vekilinin bir istisnayı yakınına atması mümkündür ve eğer bu gerçekleşirse bağlantı kapatılmaz, bu yüzden iptal etmeniz gerekir. "Try {Kapat}/catch {Abort}" desenini kullanın. Ayrıca, atma yönteminin yaklaştığını ve (dolayısıyla atmadan bir istisna atabileceğini) aklınızda bulundurun. Bu nedenle, normal tek kullanımlık sınıflarla benzer bir kullanımı kullanamazsınız. Örneğin

:

try 
{ 
    if (yourServiceProxy != null) 
    { 
     if (yourServiceProxy.State != CommunicationState.Faulted) 
     { 
      yourServiceProxy.Close(); 
     } 
     else 
     { 
      yourServiceProxy.Abort(); 
     } 
    } 
} 
catch (CommunicationException) 
{ 
    // Communication exceptions are normal when 
    // closing the connection. 
    yourServiceProxy.Abort(); 
} 
catch (TimeoutException) 
{ 
    // Timeout exceptions are normal when closing 
    // the connection. 
    yourServiceProxy.Abort(); 
} 
catch (Exception) 
{ 
    // Any other exception and you should 
    // abort the connection and rethrow to 
    // allow the exception to bubble upwards. 
    yourServiceProxy.Abort(); 
    throw; 
} 
finally 
{ 
    // This is just to stop you from trying to 
    // close it again (with the null check at the start). 
    // This may not be necessary depending on 
    // your architecture. 
    yourServiceProxy = null; 
} 

bu here

+0

+10 hakkında bir blog makale var Elimde olsa - vay, bu davranış neler olduğunu çalışmış asla, radar altında tamamen eğer bu cevaba katılmamış olsaydım. –

+0

Bravo! Bunun bir sürümünü bir uzantı yöntemi olarak uyguladım: Başkaları tarafından kullanılmak üzere proxy sınıfını deneyin. –

+0

@ Moby's Stunt Double - Kodunuzu paylaşabiliyor musunuz? – RichardHowells