ASP .NET客户端的WCF客户端代理

时间:2010-08-30 23:09:55

标签: c# wcf wcf-client

我需要一些建议,了解为ASP .NET客户端创建WCF客户端代理包装器的最佳方法。我希望与ObjectDataSource控件同样好用,没有额外的编码,当我需要手动调用WCF服务来获取一些数据时。我基本上已经提出了两个模型,但我想知道哪个更有效。

这是第一个客户端包装器

public class Facade1 : IDisposable
{
   private readonly IClient proxy = ClientProxyFactory.GetObject<IClient>();

   public List<string> GetData()
   {
      proxy.GetData()
   }

   public List<string> GetMoreData()
   {
      proxy.GetMoreData()
   }

   public void Dispose()
   {
       ClientProxyFactory.CloseChannel(this.proxy);
   }
}

现在这是另一个WCF包装器。

public class Facade2
{
   public List<string> GetData()
   {
        IClient proxy = ClientProxyFactory.GetObject<IClient>();

        try
        {
            return client.GetData();
        }
        finally
        {
            ClientProxyFactory.CloseChannel(proxy);            
        }
   }

   public List<string> GetMoreData()
   {
        IClient proxy = ClientProxyFactory.GetObject<IClient>();

        try
        {
            return client.GetMoreData();
        }
        finally
        {
            ClientProxyFactory.CloseChannel(proxy);            
        }
   }
}

在第一个示例中,只有一个客户端代理实例,它可以在各种方法之间重用,但是类需要实现IDisposable,以便客户端可以正确处理代理。在第二个示例中,每个方法有一个客户端代理,客户端不必担心处置代理。

重用不同方法之间的代理是一个好方法吗?打开/关闭WCF代理时是否有性能损失? (在这两个示例中,假设ChannelFactory已缓存,并且每次都通过cached_factory.CreateChannel()方法创建新通道。)

例如,使用第一个包装器,我可以执行以下操作:

using (Facade1 facade = new Facade1())
{
   facade.GetData()
   ...
   ...
   facade.GetMoreData()
}

在第二个例子中,我可以实例化我的外观并调用所需的方法而不必担心处理代理。

提前致谢,

埃里克

1 个答案:

答案 0 :(得分:1)

如果在ASP.NET应用程序中使用此包装器对单个HTTP请求处理中的WCF服务进行多次调用,那么使用共享代理的模型会更好。如果你想共享包装器(使其全局化),那么应该使用第二个模型。

重新创建代理的性能取决于使用的绑定的类型及其配置。例如,在BasicHttpBinding的情况下,可以快速重新创建代理,因为仍然存在来自先前代理的持久HTTP连接。但是对于带有安全上下文的WSHttpBinding,代理的重新创建意味着用于建立安全会话的新安全握手。