gpt4 book ai didi

c# - wcf 客户端代理的 Abort() 方法在捕获 FaultException 后不释放 session

转载 作者:太空狗 更新时间:2023-10-29 20:18:31 26 4
gpt4 key购买 nike

我创建了一个托管在 IIS 和 wcf 客户端中的简单 wcf 服务,并发现当您从 wcf 服务捕获 FaultException 然后调用 client.Abort() 以释放 session 时(如 Microsoft 示例所述),它不会'释放 session 并在第 11 个调用时挂断。

例子如下:

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.Abort() 替换为 client.Close() 以获取 catch(FaultException),那么一切都会正常工作,并且在第 11 次调用 wcf-service 方法后不会锁定。

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

最佳答案

两件事:

  • Abort() 应在通信 channel 处于故障状态时使用。使用 Close() 使客户端尝试与服务通信,告诉它关闭服务实例,如果您愿意的话,可以优雅地关闭。如果 Communication Channel 处于 Faulted 状态,则意味着无法从客户端到服务进行通信。在这种情况下,您应该调用 Abort(),以便至少关闭 client。服务实例/ session 在服务器上仍然存在(因为两者之间没有通信),并且会一直存在直到实例超时发生。如果您在故障 channel 上调用了 Close(),它会抛出更多错误。
  • 您的服务抛出一个 FaultException。这并不意味着通信 channel 将进入故障状态。也就是说,您仍然可以使用同一个客户端调用电话。因此,在您的示例中,您不应调用 Abort()

tl;dr Abort() 仅关闭客户端。服务实例/ session 仍然存在。

您可以使用以下方式检查通信 channel 的状态:

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

关于c# - wcf 客户端代理的 Abort() 方法在捕获 FaultException 后不释放 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3915169/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com