【问题标题】:Generating Proxy with svcutil.exe for different (non-default) collection type使用 svcutil.exe 为不同(非默认)集合类型生成代理
【发布时间】:2011-08-17 16:58:01
【问题描述】:

我正在尝试通过命令行为 wcf 服务生成代理。根据需要,我正在使用 *svcutil.exe

我需要为许多服务创建代理。示例命令如下所示。关于代理的生成,一切都在嗡嗡作响。

对于其中一个代理,我需要将 Collection 类型设置为 List 而不是默认的 Array。但是,像下面明确提到的那样,我无法正确获取集合类型。生成的代理仍然具有集合的 Array 类型。执行这些命令时没有错误。不知道发生了什么。

svcutil.exe  http://localhost/DealService.svc /noLogo               
/out:D:/Proxies/DealServiceReference.cs /n:*,MyApp.WinUI.DealServiceReference 
/ct:System.Collections.Generic.List`1

有谁知道,尽管明确提及,为什么我会得到默认的集合类型?有谁知道怎么弄好?

(子问题 - 我见过的所有将集合类型定义为列表的示例,神秘的 `1 出现在 System.Collections.Generic.List 的末尾,但我无法理解它的需要,我也无法在某处得到有效的解释。因此,如果有人能对此有所了解,那就太好了。)

【问题讨论】:

标签: wcf command-line proxy svcutil.exe


【解决方案1】:

您应该使用该开关在 DataMember 类中获取 T 类型的列表。要进行故障排除,请尝试通过为该服务添加服务引用和configuring the collection settings as shown here. 创建代理。如果使用预期的 T 列表创建服务引用,则 WSDL 是好的。如果不是,可能是 SvcUtil 不允许将集合序列化/反序列化为 T 的列表。

【讨论】:

  • 谢谢。我已经走了“添加服务参考”路线。事实上,我正在处理现有项目,其中使用“添加服务参考”选项可以正常工作。我正在尝试进行重构,从而摆脱手动添加服务参考(我的问题可以提供更多见解 - stackoverflow.com/questions/5787727/…).. 任何其他想法
  • 如果没有看到完整的 WSDL 文档,很难知道为什么命令行生成的版本可能会有不同的行为。唯一简单的替代方法是将原始 ServiceContract(和 DataMembers)放入单独的程序集中,并将其“共享”为客户端项目中的引用。这样,您可以直接从该接口使用 create ChannelFactory 而无需生成任何代理代码(请参见下面的链接)。它确实违反了 SOA 原则,但它是一种务实的方法。链接:blogs.msdn.com/b/juveriak/archive/2008/02/03/…
【解决方案2】:

注意:-

如果作为参数提供的名称相同,svcutil.exe 将覆盖磁盘上的现有文件。这可以包括代码文件、配置或元数据文件。要在生成代码和配置文件时避免这种情况,请使用/mergeConfig 开关。 此外,用于引用类型的/r/ct 开关用于生成数据协定。这些开关在使用XmlSerializer 时不起作用。

参考:https://msdn.microsoft.com/en-us/library/aa347733(v=vs.110).aspx

这可能是你的情况,检查使用的序列化器...

【讨论】:

    猜你喜欢
    • 2012-05-08
    • 2010-12-14
    • 2013-08-21
    • 2010-11-03
    • 2010-09-13
    • 1970-01-01
    • 2010-12-10
    • 2021-04-04
    • 2013-11-22
    相关资源
    最近更新 更多