这两种使用wcf服务的方式哪一种更好?为什么?
例如。
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());
创建代理并关闭或中止它是好方法吗?
Here是一篇MSDN帖子,建议不要在.Net 3中使用生成的代理,因为它每次都会创建ChanelFactory,.Net 3.5 ChanelFactory被缓存。
但我个人更喜欢自己使用ChanelFactory,生成的代码即使在
partials
出来之后也总是很痛苦
在第一种情况下,当您使用 VS 添加服务引用时,它会为您生成所有代码,包括 ServiceContrcats 和 DataContracts。
但是当您使用
ChannelFactory
时,您必须在客户端拥有服务合同等。
我建议使用方法1。
我找到了这个博客,其中包含一个包含源代码的示例,该示例还解释了如何正确处理连接(关闭、中止等)。该博客还包含 MSDN 上更多详细信息的链接。
从正在运行的服务手动创建服务代理可能是一个不错的选择。 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 /?
获取更多信息。