生成wcf代理与ChannelFactory

时间:2010-08-05 11:02:40

标签: c# wcf proxy

这两种使用wcf服务的方法中哪一种更好?为什么呢?

  1. 从服务参考生成代理
  2. 使用ChannelFactory
  3. 离。

    ChannelFactory<IMyContract> factory = new ChannelFactory<IMyContract>();
    IMyContract proxy1 = factory.CreateChannel();
    proxy1.MyMethod();
    

    调用像so

    这样的wcf服务有点无聊
    IMyContract proxy1 = null; 
    try
    {
        proxy1 = factory.CreateChannel();
        proxy1.MyMethod();
        ((ICommunicationObject)proxy1).Close();
    }
    catch
    {
       ((ICommunicationObject)proxy1).Abort();
    }
    

    我们是否应该为每个代理呼叫重复此代码段?或者是否有通用的方法来创建一个用于关闭和中止代理的包装类?

    编写类似ServiceExecution.Execute(proxy=>proxy.MyMethod());的类创建代理,关闭或中止它是很好的方法吗?

4 个答案:

答案 0 :(得分:3)

Here是一篇MSDN帖子,建议不要在.Net 3中使用生成的代理,因为它每次创建ChanelFactory,.Net 3.5 ChanelFactory都被缓存。

但我个人更喜欢自己使用ChanelFactory,即使在partials问世后,生成的代码总是很痛苦

答案 1 :(得分:2)

首次使用VS添加服务引用时,它会为您生成所有代码,包括ServiceContrcats和DataContracts。

但是当你使用ChannelFactory时,你必须已经在客户端拥有服务合同等。

答案 2 :(得分:2)

我建议使用方法1.

我发现这个blog的示例包括源代码,该代码还解释了如何正确处理连接(关闭,中止等)。该博客还包含有关MSDN更多详细信息的链接。

答案 3 :(得分:0)

从正在运行的服务手动创建服务代理可能是一个不错的选择。工具 svcutil 是Visual Studio在添加服务引用时使用的工具。使用此方法,您可以在公共位置生成代理类,然后在您需要的每个项目中链接到它,并且还可以更好地控制代理类。

例如,要为在端口8000上本地运行的名为 TestService 的服务生成代理,您将在Visual Studio命令提示符中运行以下命令,生成代理类TestServiceProxy.cs in代理目录。

cd "C:\src\proxies"
svcutil /noLogo /out:TestServiceProxy http://localhost:8000/TestService

该工具还有一些其他有用的参数,例如:

添加/n:*,WcfServices.TestService将为代理类指定命名空间。

添加/config:TestServiceProxy.config,svcutil将生成一个示例配置文件,用于使用TestService,包括端点,绑定等。

添加/r:"Common.dll",svcutil发出的代理类将不具有服务使用的类型的定义,但在程序集Common.dll中定义。

使用svcutil /?获取更多信息。