Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WCF客户端,是否保留引用?_C#_.net_Wcf - Fatal编程技术网

C# WCF客户端,是否保留引用?

C# WCF客户端,是否保留引用?,c#,.net,wcf,C#,.net,Wcf,考虑以下场景: 有一个承载WCF服务的windows服务 WCF服务在客户端和位于物理上不同的计算机上的AppFabric服务器之间提供接口。它检索对象,对其进行计算并返回最佳值 20-30个客户端可以同时连接到该服务,这并不多 更好的做法是,每次对服务执行查询时都创建一个实例,或者将客户机对象作为成员并调用函数。创建一个实例会把我不喜欢的try-finally块弄得乱七八糟,但是客户端连接又有什么缺点呢?是否可以重新启动主机并使客户端仍然工作?通常/首选的方法是什么 try { PreOr

考虑以下场景:

有一个承载WCF服务的windows服务

WCF服务在客户端和位于物理上不同的计算机上的AppFabric服务器之间提供接口。它检索对象,对其进行计算并返回最佳值

20-30个客户端可以同时连接到该服务,这并不多

更好的做法是,每次对服务执行查询时都创建一个实例,或者将客户机对象作为成员并调用函数。创建一个实例会把我不喜欢的try-finally块弄得乱七八糟,但是客户端连接又有什么缺点呢?是否可以重新启动主机并使客户端仍然工作?通常/首选的方法是什么

try
{
  PreOrderService.PreorderServiceClient proxy = new   PreOrderService.PreorderServiceClient("netTcpPreorderService");

  List<PreOrder> preOrders = proxy.FindWallet(preOrder.WalletId);
}
finally
{
  if (proxy.State != CommunicationState.Faulted)
    proxy.Close();
}
试试看
{
PreOrderService.PreOrderService客户端代理=新的PreOrderService.PreOrderService客户端(“netTcpPreorderService”);
List preOrders=proxy.FindWallet(preOrder.WalletId);
}
最后
{
if(proxy.State!=CommunicationState.Faulted)
proxy.Close();
}

我更喜欢做以下事情:

proxy = newServiceReference1.ServiceDataContractTestClient(); 
try
{ 
    proxy.MetodThrowsException();
    proxy.Close(); 
} 
catch
{ 
    proxy.Abort(); 
    throw; // Or handle exception
}
这与服务器连接是否丢失无关,也不会在proxy.MetodThrowsException()中断服务器时引发CommunicationObjectFaultedException


如果你发现它降低了可读性,那么用一个单独的方法将其包装。

我有一个答案的可能重复,我将其删除,因为进一步阅读(即来自CodeCaster的可能重复的问题,以及CodeCaster在对我的答案的评论中提出的一些观点)表明我自己的答案是无知的。我想说明的一个重要部分是,即使您确实将代理设置为对象成员(非常确定您仍然可以),您仍然需要try/catch/finally来处理通过代理的每个调用。