Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.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#_Wcf - Fatal编程技术网

C# 调用WCF服务的最佳实践

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

我一直都知道,像这样调用WCF服务时,决不要使用using语句

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
”。我做了一个参考并阅读了那篇文章,我不清楚什么是最佳实践。我还问我引用的代码示例是否真的关闭了连接。我做了一个引用并阅读了那篇文章,但我不清楚什么是最佳实践。我还问我所引用的代码示例是否真的关闭了连接。