2010-10-12 16 views
6

yakalamak sonra oturumu serbest bırakmaz. Abort() oturumu serbest bırakmak için (microsoft örnekleri dediği gibi) oturumu serbest bırakmaz ve 11. aramayı kapatır.İptal() yöntemi IIS ve istemci WCF barındırılan basit bir wcf hizmeti oluşturulan ve u wcf servisinden bir FaultException yakalamak ve daha sonra müşteri aradığında bunu anlayabilmem Hatası

Wcf Hizmeti::

[ServiceContract] 
public interface IService1 
{ 
    [OperationContract] 
    string GetData(int value); 
} 


public class Service1 : IService1 
{ 
    public string GetData(int value) 
    { 
     throw new FaultException("Exception is here"); 

     return string.Format("You entered: {0}", value); 
    } 
} 

Müşteri: Burada

örnektir

class Program 
{ 
    static void Main(string[] args) 
    { 
     Service1Client client = null;   

     for(int i = 0; i < 15; i++) 
     { 
      try 
      { 
       client = new Service1Client(); 
       client.GetData(100);     
      } 
      catch (TimeoutException timeoutEx) 
      { 
       Console.WriteLine(timeoutEx); 
       client.Abort(); 
      } 
      catch (FaultException faultEx) 
      { 
       Console.WriteLine(faultEx); 
       client.Abort(); 
      } 
      catch (CommunicationException commEx) 
      { 
       Console.WriteLine(commEx); 
       client.Abort(); 
      } 
     } 
    }    

}

Ama client.Close ile client.Abort() değiştirin eğer() yakalamak için (FaultException) sonra her şey bir çekicilik gibi çalışır ve wcf'nin 11. çağrısından sonra kilitleme yoktur -servis yöntemi.

Neden olabilir? FaultException yakalandıktan sonra neden Abort() yöntemi oturumu temizlemiyor?

+2

sadece buradan yapıştırılan kopya mı? http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/f86c056a-4027-453a-a46c-fc223e03589b/ – oleksii

cevap

2

Bu yolu denediniz mi, WCF'yi aramak için kullandığım?

class Program 
{ 
static void Main(string[] args) 
{ 
    for(int i = 0; i < 15; i++) 
    { 
     using Service1Client client = new Service1Client() 
     { 
     try 
     { 
      client.GetData(100);     
     } 
     catch (TimeoutException timeoutEx) 
     { 
      Console.WriteLine(timeoutEx); 
      client.Abort(); 
     } 
     catch (FaultException faultEx) 
     { 
      Console.WriteLine(faultEx); 
      client.Abort(); 
     } 
     catch (CommunicationException commEx) 
     { 
      Console.WriteLine(commEx); 
      client.Abort(); 
     } 
     finally 
     { 
      client.Close(); 
     } 
     } 
    } 
}    
+0

Bu yanıt, bu yöntemi kullandığınız hakkında bir açıklama içermesi durumunda daha yararlı olacaktır. . –

5

İki şey: İletişim Kanalı bir Arızalı durumdayken

  • Abort() kullanılmalıdır. Close()'u kullanmak istemciyi, hizmet örneğini, hizmet örneğini kapatmak için zarif, isterseniz, hizmet ile iletişim kurmayı dener. Haberleşme Kanalı Hatalı durumda ise, müşteriden servise iletişim kurulamayacağı anlamına gelir. Bu durumda, en az istemcisinin kapalı olması için Abort()'u aramanız gerekir. Hizmet örneği/oturumu sunucuda hala canlı olacak (ikisi arasında iletişim olmadığı için) ve örnek zaman aşımı gerçekleşene kadar bu şekilde kalacaktır. Arızalı bir kanalda Close() aradıysanız, daha fazla hata atmış olur.
  • Hizmetiniz FaultException atıyor. Bu, İletişim Kanalı'nın hatalı duruma getirileceği anlamına gelmez. Yani aynı müşteriyi kullanarak arama yapabilirsiniz. Ve örneğinizde, örneğinizde Abort()'u aramamalısınız.

tl, drAbort() sadece istemci kapatır. Hizmet örneği/oturumu hala canlı.

Sen kullanarak Haberleşme Channel'ın devlet için kontrol edebilirsiniz:

ICommunicationObject comObj = ((ICommunicationObject)client); 
if(comObj.State == CommunicationState.Faulted) 
    client.Abort(); 
else 
    client.Close();