2010-10-12 122 views
6

我已经创造了IIS和WCF客户举办了简单的WCF服务,并想通了,当u赶上从WCF服务的FaultException,然后调用客户端后,不释放会议。中止()释放会话(如微软样本所述),它不释放会话并在第11次呼叫挂断。中止()WCF客户端代理的方法捕获的FaultException

这里是例子:

WCF服务:

[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); 
    } 
} 

客户:

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(); 
      } 
     } 
    }    

}

但是如果你client.Close更换client.Abort() ()for catch(FaultException),那么所有东西都像魅力一样,在第11次调用wcf后没有锁定 - 服务方法。

为什么会这样?为什么在FaultException被捕获后Abort()方法不会清理会话?

+2

你刚才复制的粘贴在这里呢? http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/f86c056a-4027-453a-a46c-fc223e03589b/ – oleksii 2011-05-04 17:16:33

回答

2

您是否尝试过这种方式,我用调用WCF?

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

如果它包含的,为什么你使用此方法的解释这个答案会更有帮助。 – 2015-04-15 13:54:10

5

两件事情:

  • Abort()当通信信道处于故障状态应该被使用。使用Close()可以让客户端尝试与服务进行通信,并告诉它关闭服务实例,如果愿意的话,可以优雅地使用服务实例。如果通信通道处于故障状态,则意味着不能从客户端到服务器进行通信。在这种情况下,您应该致电Abort(),以便至少关闭客户端。服务实例/会话将在服务器上保持活动状态(因为两者之间没有通信),并且在实例超时发生之前将保持这种状态。如果您在故障通道上调用了Close(),则会引发更多错误。
  • 您的服务投掷FaultException。这并不意味着通信通道将进入故障状态。即您仍然可以使用同一个客户端拨打电话。因此,在你的例子中,你不应该叫Abort()

TL;博士Abort()仅关闭客户端。服务实例/会话仍然存在。

您可以通过检查通信信道的状态:

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