Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WCF ChannelFactory与生成代理_Wcf_Proxy_Channelfactory - Fatal编程技术网

WCF ChannelFactory与生成代理

WCF ChannelFactory与生成代理,wcf,proxy,channelfactory,Wcf,Proxy,Channelfactory,只是想知道在什么情况下,当您可以使用ChannelFactory调用调用时,您更愿意从WCF服务生成代理 这样,您就不必生成代理,也不用担心在服务器更新时重新生成代理 非常感谢为了使用ChannelFactory,您必须愿意在服务和客户端之间共享合同程序集。如果您同意,那么ChannelFactory可以为您节省一些时间。代理将构建异步函数,这有点不错。创建WCF客户端有3种基本方法: 让VisualStudio生成您的代理。这会自动生成通过读取WSDL连接到服务的代码。如果服务因任何原因发生更

只是想知道在什么情况下,当您可以使用ChannelFactory调用调用时,您更愿意从WCF服务生成代理

这样,您就不必生成代理,也不用担心在服务器更新时重新生成代理


非常感谢

为了使用
ChannelFactory
,您必须愿意在服务和客户端之间共享合同程序集。如果您同意,那么
ChannelFactory
可以为您节省一些时间。

代理将构建异步函数,这有点不错。

创建WCF客户端有3种基本方法:

  • 让VisualStudio生成您的代理。这会自动生成通过读取WSDL连接到服务的代码。如果服务因任何原因发生更改,您必须重新生成它。它的最大优点是易于设置-VS有一个向导,并且是全自动的。缺点是你依赖VS为你做所有的艰苦工作,因此你失去了控制

  • 使用具有已知接口的
    ChannelFactory
    。这依赖于您拥有描述服务的本地接口(服务契约)。最大的优点是可以更轻松地管理更改—您仍然需要重新编译和修复更改,但现在您不是在重新生成代码,而是在引用新的接口。当您同时控制服务器和客户机时,通常会使用这种方法,因为在进行单元测试时,这两种方法都更容易模拟。但是,可以为任何服务编写接口,即使是REST服务——请看一看

  • 编写您自己的代理-使用
    HttpClient
    WebClient
    编写代理相当容易,特别是对于REST服务。这为您提供了最细粒度的控制,但代价是大量服务API都是字符串。例如:
    var content=new-HttpClient()http://yoursite.com/resource/id二、内容-如果API的详细信息发生更改,则在运行时之前不会遇到错误

  • 就我个人而言,我从来都不喜欢选项1——依赖自动生成的代码是混乱的,失去了太多的控制。另外,它经常会产生序列化问题——我最终得到了两个相同的类(一个在服务器代码中,一个自动生成),它们可以被整理,但很痛苦


    选项2应该是完美的,但是频道有点太有限了——比如说它们。也就是说,拥有描述服务的接口更容易编码和维护。

    我使用ChannelFactory和MetadataResolver.Resolve方法。客户端配置很麻烦,所以我从服务器获取ServiceEndpoint

    使用ChannelFactory(Of T)时,T是可以从项目中的引用中获得的原始合同或生成的合同实例。在一些项目中,我从服务引用生成代码,因为我无法向契约dll添加引用。您甚至可以使用服务引用生成异步契约,并将该契约接口用于ChannelFactory

    对我来说,使用ChannelFactory的主要目的是去除WCF客户机配置信息。在下面的示例代码中,您可以看到如何在没有配置的情况下实现WCF客户端

    Dim fixedAddress = "net.tcp://server/service.svc/mex"
    Dim availableBindings = MetadataResolver.Resolve(GetType(ContractAssembly.IContractName), New EndpointAddress(fixedAddress))
    factoryService = New ChannelFactory(Of ContractAssembly.IContractName)(availableBindings(0))
    accesService = factoryService.CreateChannel()
    
    在我的最后一个项目中,将检查可用的绑定以使用net.tcp或net.pipe(如果可用)。这样,我就可以使用最好的绑定来满足我的需要。我只依赖服务器上存在元数据端点这一事实

    我希望这有帮助


    顺便说一句,这是使用.NET3.5完成的。不过,它也适用于4.0。

    我的答案是对和答案的一种总结

    若您不控制服务器,但只有WSDL/URL,则使用Visual Studio或svcutil生成代理。(请注意,当svcutil工作得更好时,VisualStudio有时会失败)

    当您同时控制服务器和客户端时,共享接口/合同并调用ChannelFactory

    这不仅仅是节省时间的问题。使用WSDL生成的代理是危险的,因为如果忘记更新服务引用,则可能会使解决方案处于不一致的状态。一切正常,但服务合同被破坏。我明确建议尽可能使用ChannelFactory,这会让你的生活更轻松


    一种可能的替代方法是编写一个预构建脚本,在每次构建项目时调用svcuti实用程序来创建代理,但无论如何,ChannelFactory要简洁得多。

    是-同时,Visual Studio的“添加服务引用”以及命令行上的svcutil.exe,使您的配置无法识别。。。。至少使用svcutil.exe,您可以定义“/noconfig”开关…..ChannelFactory还提供异步方法:但我更喜欢使用T4模板使用ThreadPool创建异步类,该线程池将调用同步方法。作为更新:使用.NET 4.5 ChannelFactory也支持基于任务的异步函数。很棒的东西。我在配置中也使用MetadataResolver.Resolve,但我没有考虑从服务器解析绑定。很好的观点!请投票支持使用ChannelFactory删除WCF客户端配置的要点,查尔斯-你能解释一下为什么这不是真的吗?@Aran:我认为Andrew的意思是正确的-如果你不想生成合同类的传真,那么你需要访问原件。确实,不管怎样,您都需要使用这些契约类。您可以生成它们,手工编写它们,或者获取服务源代码(如果使用相同的语言)。共享程序集是最简单的方法,但这并不总是可能的。(也许我只是从字面上理解安德鲁,但清晰性在这里很重要。)@Charles好的,那么你是说你可以使用ChannelFactory,即使你无法通过手工编码T的接口访问程序集,然后使用它。@Aran:是的,可以通过手工编码或usi