在不生成代理的情况下动态执行基于SOAP的Web服务

时间:2014-07-14 07:41:56

标签: c# web-services wcf soap

在我的应用程序中,最终用户可以从任何基于SOAP的Web服务获取数据并在应用程序中使用它。该应用程序提供了一个在运行中注册服务的选项。应用程序检查服务,显示可用的操作以及参数,最后执行所选操作并使用响应,当然一切都将在运行中。为了实现这一目标,需要遵循的步骤很少:

  1. 通过WSDL发现服务
  2. 检查并选择方法
  3. 构建所需的参数值
  4. 执行服务
  5. 处理回复
  6. 我能够使用一些WCF类(如DiscoveryClientProtocol,WsdlImporter,ServiceDescription,ServiceContractGenerator等)即时发现服务。现在,我想执行它们并获取SOAP Body中可用的响应XML。

    我可以通过使用上面的库在运行时生成程序集来执行它,并通过反射执行一个方法。如果我必须在盒子上单拍一切,这个解决方案工作正常。但是当我们横向扩展时,它增加了复杂性。这意味着,一个服务器生成代理,另一个服务器使用代理并使用服务。

    是的,我们可以将新生成的程序集保存在共享位置的某个位置并使用它们。但我想避免它们。我们希望将服务定义保存在DB的本地,在不生成程序集的情况下执行它,只使用SOAP体内可用的XML。

    提前了解如何实现这一目标的建议?

2 个答案:

答案 0 :(得分:1)

要在没有代码生成的情况下与WCF服务进行通信,请使用ChannelFactory< T >,其中T是服务接口。

显然在您的情况下,服务接口在编译时是未知的,因此您的目标是动态生成此类型,或者更好地使用不依赖于强类型的自定义ChannelFactory实现,并允许您在动态中调用方法或程序化的方式。

您可以使用WsdlImporter在运行时导入WSDL,它可以为您提供ContractDescription。从那里你可以使用ContractType作为你的服务界面,但我不确定。您可能需要编写自己的ChannelFactory ...

答案 1 :(得分:0)

您可以将ChannelFactory实现为抽象通用BaseFactory类,该类具有覆盖CreateDescription方法以设置ChannelFactory.ServiceEndpoint的Binding和Endpoint。您可以将具有Binding,Endpoint和Credentials的配置界面传递给此抽象类。因此,您可以拥有wcf服务的动态代理。