繁体   English   中英

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

[英]WCF client proxy for ASP .NET 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()
}

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

提前致谢,

埃里克

如果在ASP.NET应用程序的单个HTTP请求处理中将此包装用于WCF服务的多次调用,则比使用共享代理的模型更好。 如果要共享包装器(使其全局),则应使用第二个模型。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM