C# 调用WCF服务的最佳实践
我一直都知道,像这样调用WCF服务时,决不要使用using语句C# 调用WCF服务的最佳实践,c#,wcf,C#,Wcf,我一直都知道,像这样调用WCF服务时,决不要使用using语句 using (Service.YourClientProxy client = new Service.YourClientProxy()) { var time = client.Time(); } 所以我总是用这个呼叫服务 YourClientProxy clientProxy = new YourClientProxy(); try { .. use your service clientProxy.C
using (Service.YourClientProxy client = new Service.YourClientProxy())
{
var time = client.Time();
}
所以我总是用这个呼叫服务
YourClientProxy clientProxy = new YourClientProxy();
try
{
.. use your service
clientProxy.Close();
}
catch(FaultException)
{
clientProxy.Abort();
}
catch(CommunicationException)
{
clientProxy.Abort();
}
catch (TimeoutException)
{
clientProxy.Abort();
}
我一直在读och stackoverflow,我也读过这篇文章
Service.cs类取自
我想知道下面这是否是呼叫WCF服务的一个好做法,这是否真的关闭了服务?
public static class Service<TChannel>
{
public static ChannelFactory<TChannel> ChannelFactory = new ChannelFactory<TChannel>("*");
public static TReturn Use<TReturn>(Func<TChannel, TReturn> codeBlock)
{
var proxy = (IClientChannel)ChannelFactory.CreateChannel();
var success = false;
try
{
var result = codeBlock((TChannel)proxy);
proxy.Close();
success = true;
return result;
}
finally
{
if (!success)
{
proxy.Abort();
}
}
}
}
公共静态类服务
{
公共静态ChannelFactory ChannelFactory=新ChannelFactory(“*”);
公共静态TReturn使用(Func代码块)
{
var proxy=(IClientChannel)ChannelFactory.CreateChannel();
var成功=false;
尝试
{
var结果=代码块((TChannel)代理);
proxy.Close();
成功=真实;
返回结果;
}
最后
{
如果(!成功)
{
proxy.Abort();
}
}
}
}
像这样从客户端调用服务
var time = Service<Service.YourServiceChannel>.Use(resultAsync =>
{
return resultAsync.TimeAsync();
});
var time=Service.Use(resultAsync=>
{
返回resultAsync.TimeAsync();
});
来自本文:
最佳做法似乎是通过在try块中调用Close来调用Dispose:
try
{
client.Close();
}
catch (CommunicationException e)
{
client.Abort();
}
catch (TimeoutException e)
{
client.Abort();
}
catch (Exception e)
{
client.Abort();
throw;
}
您还可以在每个catch
块中添加日志记录或其他内容。本文:
最佳做法似乎是通过在try块中调用Close来调用Dispose:
try
{
client.Close();
}
catch (CommunicationException e)
{
client.Abort();
}
catch (TimeoutException e)
{
client.Abort();
}
catch (Exception e)
{
client.Abort();
throw;
}
您还可以在每个
catch
块中添加日志记录或其他内容。-1:您的Dispose
在哪里?这个问题是重复的。在这里调用Close()和调用Dispose()不是一回事吗?基本上,在这种情况下,您的答案应该是“Close
”而不是“Dispose
”。-1:您的Dispose
在哪里?这个问题是重复的。在这里调用Close()和调用Dispose()不是一回事吗?基本上,在这种情况下,你的答案应该是“Close
”而不是“Dispose
”。我做了一个参考并阅读了那篇文章,我不清楚什么是最佳实践。我还问我引用的代码示例是否真的关闭了连接。我做了一个引用并阅读了那篇文章,但我不清楚什么是最佳实践。我还问我所引用的代码示例是否真的关闭了连接。