Svcutil 生成的代理是否比运行时使用的 ChannelFactory 提供更好的性能? ChannelFactory 是否默认缓存代理?

我将 .NET 4 与一项服务一起使用,该服务有 100 多个操作和 500 多个参与其中的数据契约(Contract)。

当我使用 ChannelFactory<T> 时,返回代理需要很长时间。有人可以建议哪种是创建代理的最佳方式吗?

我的代码如下所示:

EndpointAddress endPoint = new EndpointAddress(url);
// My own API which gives the custom binding I create programatically
CustomBinding binding = BindingFactory.GetCustomBinding("WSECustomBinding");
ChannelFactory<T> factory = new ChannelFactory<T>(binding, endPoint);

最佳答案

当您使用 Svcutil 生成代码时,您会得到一个扩展 ClientBase 的类,它是 ChannelFactory 的包装器。

Svcutil 代理允许您将服务作为对象的方法调用,而不是直接与 ChannelFactories/Channels 交互,除此之外,它确实提供了一些额外的功能,比如缓存 channel 工厂,但在后台它是 the same engine

从您的代码中不清楚您在做什么,但是您是否在每次操作调用时都创建了 ChannelFactory?创建 ChannelFactory 的开销很大,您通常会缓存该实例,然后使用它来打开、使用和关闭 Channels 以进行操作调用。

有关更详细的说明,请参阅以下页面:

  • Performance Improvement for WCF Client Proxy Creation in .NET 3.5 and Best Practices
  • Best Practice: Always open WCF client proxy explicitly when it is shared
  • 关于wcf - ChannelFactory<T> 与使用 Svcutil 的预生成代理的性能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9528743/

    10-12 16:44