Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.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_Wcf Client - Fatal编程技术网

C# 使用wcf客户端的最佳方式是什么?(内存方面)

C# 使用wcf客户端的最佳方式是什么?(内存方面),c#,wcf,wcf-client,C#,Wcf,Wcf Client,我已经了解到wcf客户端的内存使用情况,到目前为止我所做的可能是错误的。 当我使用wcf客户端时,我为每个调用创建了一个新的wcf客户端。(用于自托管和iis)。 这是去的路吗?当然,我应该创建一个客户机作为成员,并全面使用它? wcf客户端的真正内存使用情况是什么? 谢谢我认为您应该只在需要从新端点调用服务操作时创建新客户端,但绑定通常保持不变。因此,您可以创建一个工厂类,为特定的契约+绑定但不同的端点创建客户端。例如,以下内容适用于WebHttpBinding,但您可以替换所需的任何绑定:

我已经了解到wcf客户端的内存使用情况,到目前为止我所做的可能是错误的。
当我使用wcf客户端时,我为每个调用创建了一个新的wcf客户端。(用于自托管和iis)。
这是去的路吗?当然,我应该创建一个客户机作为成员,并全面使用它?
wcf客户端的真正内存使用情况是什么?

谢谢

我认为您应该只在需要从新端点调用服务操作时创建新客户端,但绑定通常保持不变。因此,您可以创建一个工厂类,为特定的契约+绑定但不同的端点创建客户端。例如,以下内容适用于WebHttpBinding,但您可以替换所需的任何绑定:

public class WebHttpClient<T> 
{
    protected WebHttpBinding Binding { get; private set; }

    public WebHttpClient()
    {
        // set default binding here
    }

    public WebHttpClient(WebHttpBinding binding)
    {
        Binding = binding; 
    }

    public T Get(string uri)
    {
        EndpointAddress _endpoint = new EndpointAddress(uri);
        ChannelFactory<T> _factory = new ChannelFactory<T>(Binding, _endpoint);

        _factory.Endpoint.Behaviors.Add(new WebHttpBehavior());
        return _factory.CreateChannel();
    }
}
公共类WebHttpClient
{
受保护的WebHttpBinding{get;private set;}
公共WebHttpClient()
{
//在此处设置默认绑定
}
公共WebHttpClient(WebHttpBinding绑定)
{
绑定=绑定;
}
公共T获取(字符串uri)
{
EndpointAddress _endpoint=新的EndpointAddress(uri);
ChannelFactory _factory=新的ChannelFactory(绑定,_端点);
_添加(新的WebHttpBehavior());
返回_factory.CreateChannel();
}
}

其中T是您的服务合同

这意味着,如果您已经为特定绑定创建了客户端,工厂将返回创建的客户端?每次调用方法Get over时,它都将返回指定端点处的服务契约实现实例。有很多不同的方法可以走,但我认为使用ChannelFactory的基本公式最适合创建客户机。WCF操作中最昂贵的部分(据我所知)是创建客户机。上面的示例很好,但我会更进一步,为每个服务和缓存调用ChannelFactory一次,然后在创建通道时从缓存的副本执行该操作。这样,您可以生成多个通道,但只会产生一次初始成本。您是否确实存在内存问题?如果是这样:您正在处理它们吗?嗯,是的,我有内存问题,我通过使用语句松开
并正确地处理它们来修复它们,我想知道创建客户机最昂贵的部分是
ChannelFactory
还是
ChannelFactory.CreateChannel()
方法。