这两种使用wcf服务的方法中哪一种更好?为什么呢?
离。
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());
的类创建代理,关闭或中止它是很好的方法吗?
答案 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 /?
获取更多信息。