生成WCF代理与ChannelFactory

问题描述 投票:0回答:4

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

  1. 从服务引用生成代理
  2. 使用 ChannelFactory

例如。

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

像这样调用wcf服务有点无聊so

IMyContract proxy1 = null; 
try
{
    proxy1 = factory.CreateChannel();
    proxy1.MyMethod();
    ((ICommunicationObject)proxy1).Close();
}
catch
{
   ((ICommunicationObject)proxy1).Abort();
}

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

像这样编写类

ServiceExecution.Execute(proxy=>proxy.MyMethod());
创建代理并关闭或中止它是好方法吗?

c# wcf proxy
4个回答
3
投票

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

但我个人更喜欢自己使用ChanelFactory,生成的代码即使在

partials
出来之后也总是很痛苦


2
投票

在第一种情况下,当您使用 VS 添加服务引用时,它会为您生成所有代码,包括 ServiceContrcats 和 DataContracts。

但是当您使用

ChannelFactory
时,您必须在客户端拥有服务合同等。


2
投票

我建议使用方法1。

我找到了这个博客,其中包含一个包含源代码的示例,该示例还解释了如何正确处理连接(关闭、中止等)。该博客还包含 MSDN 上更多详细信息的链接。


0
投票

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

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

TestServiceProxy.cs

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 /?
获取更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.