2010-08-30 147 views
0

我需要一些关于为ASP .NET客户端创建WCF客户端代理包装程序的最佳方法的建议。我想和ObjectDataSource控件一样工作,没有额外的编码,而且当我需要手动调用WCF服务来获取一些数据时也是如此。我基本上已经想出了两种模型,但我想知道哪种效率更高。用于ASP .NET客户端的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() 
} 

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

由于提前,

埃里克

回答

1

如果使用此包装在除与共享代理模式是更好的ASP.NET应用程序多次调用WCF服务的一个HTTP请求处理。如果你想共享包装(使其成为全局),那么应该使用第二个模型。

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

+0

我打算为第一个包装或第二个包装创建一个单独的程序集,具体取决于我选择哪一个。在第一个模型中共享包装是否存在问题?现在为了解决性能问题,现在这个服务被托管在Windows 2003服务器w/IIS6中,所以我只使用basicHttpBinding,但是将来我们可能会升级到Windows Server 2008并将其托管在IIS7中,我可以在其中使用netTcpBinding和WAS IIS7。我有点像第一个模型,其中代理是在方法之间共享的。唯一的缺点是客户必须记得正确地处理包装。 – Eric 2010-08-31 13:36:53