【问题标题】:Programmatically connect to a wcf以编程方式连接到 wcf
【发布时间】:2011-04-21 08:46:06
【问题描述】:

我需要帮助来弄清楚如何以编程方式连接到 WCF 服务。

这需要在不了解 WCF 服务的情况下完成,我只有一个地址。我没有在应用程序中添加所有 wcf 服务的选项。

我正在处理的应用程序将监视许多其他应用程序并验证它们是否存在。也许每分钟左右。

我有一个 wcf 服务的地址列表,这些地址可能会增长和缩小,因此我需要帮助来构建一个 c# 函数,该函数可以获取地址并连接到 wcf 服务,然后从该 wcf 服务请求信息。

我进行了很多搜索,但找不到有关如何使用 c# .net 4.0 完成此操作的信息和示例,因此非常感谢您的帮助。

谢谢

【问题讨论】:

  • 您有 wsdl 文件或至少知道您可以调用的操作吗?
  • 我认为您最好知道服务是否有 mex 端点,例如: 如果是,那么你可以尝试连接到那个。
  • 你需要至少知道WCF端点的ABC:地址、绑定(协议)、合同(它提供什么方法​​)
  • 我没有 wsdl 文件。
  • 我只知道wcf服务地址,仅此而已。感觉不需要知道什么就可以以编程方式完成其余的工作并且有点通用。

标签: .net wcf c#-4.0


【解决方案1】:

您需要做的是在运行时创建代理,然后使用新创建的代理来调用服务。

这种类型的动态代理应该使用 MetadataResolver 类从服务中下载元数据,然后使用 WsdlImporter 类在运行时创建契约和绑定。

编译动态代理后,您可以使用反射调用服务上的操作。这里有一个 WCF 动态代理的实现和解释,可以帮助您入门:

http://blogs.msdn.com/b/vipulmodi/archive/2006/11/16/dynamic-programming-with-wcf.aspx

您可以从以下位置下载代码:

http://code.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=netfxsamples&DownloadId=3939)

【讨论】:

  • 这就是我相信我正在寻找的东西,谢谢!我会调查一下。
  • 这就是我的解决方案,坦克。 :-) 但是它有点重,我无法进行轻量级测试。
【解决方案2】:

一种可能性是使用MetadataExchangeClient 从实时 WCF 服务获取元数据,或者因错误而失败,这将用作“ping”解决方案。

【讨论】:

  • 如果我要求的元数据可能是很多千字节,并且如果我想每分钟检查一次 wcf 服务,那么我的监视程序会产生不必要的压力,所以我希望有更好的解决方案可用所有你我都没有找到它。
【解决方案3】:

您是否尝试过使用svcutil tool。您可以使用它来创建不同的代理类(对于您需要的每个服务),然后您就可以以非常简单的方式访问服务。如果将新服务(带有新元数据)添加到列表中,您只需扩展您的应用即可。

要使用svcutil,您只需要知道服务地址即可。其他一切都可以自动完成。

【讨论】:

  • 如果我这样做了,那么我需要做的不是以编程方式完成。我只有每个 wcf 服务的地址,它们可以更改。如果我有 100 个 wcf 服务需要监视,那么需要大量手动维护。因此我需要它以编程方式完成。
  • 啊哈好吧,他们可能动态代理确实是最好的方法。但是我认为您仍然需要在您的代码和代理上的对应方法之间进行一些映射。就个人而言,我会尽量避免手动创建请求和响应。
猜你喜欢
  • 1970-01-01
  • 2013-02-02
  • 2012-07-22
  • 2011-02-25
  • 1970-01-01
  • 1970-01-01
  • 2015-07-30
  • 2013-06-12
  • 2011-10-27
相关资源
最近更新 更多