【问题标题】:How can I prevent an out-parameter to end up return parameter in a WCF web service?如何防止输出参数最终返回 WCF Web 服务中的参数?
【发布时间】:2012-07-02 22:39:20
【问题描述】:

如果我的合同如下所示:

[OperationContract]
void DoSomething(int id, out string moreInfo);

这最终看起来像:

string DoSomething(int id);

当您导入 Web 服务引用时。是否可以影响参数顺序的自动转换?在函数签名的开头找到所有输出参数已经令人惊讶,但这仍然可行,但我们希望 void-methods 继续成为 void-methods。还是这是 SOAP 限制?

【问题讨论】:

  • 在这种情况下,具有单个 out 参数的 void 方法实际上是具有正确返回值的非 void 方法。定义out 参数给您带来了非输出版本没有的什么?
  • @AdamHouldsworth 在 Web 服务设计中的正交性。我们最初有返回值的服务和没有返回值的服务。但是,每个服务都被重构为返回状态。通过强制额外的参数,构建将自动失败,并且我们知道在哪里修复什么,此外,始终知道第一个参数是包含状态的输出参数非常方便,而不管合同的其余部分。跨度>
  • WCF 能够为该操作生成代理实际上让我感到非常惊讶和印象深刻!首先使用out 参数的基本原理是什么?
  • @Abel 就我个人而言,我会创建一个包含状态并将数据打包的合同返回。在创建 Web 服务方法时,我倾向于避免使用 C# 功能。据我所知,您在参考创建屏幕上获得的任何选项都是用于控制代理生成的唯一可用选项。
  • @MattDavey 有超出参数的情况并不少见。这不是 C# 独有的功能,它在其他语言中更为常见(其中之一是 C++),在 IDL 中,有 [in][out][in, out] 参数是很正常的。用例/原因通常是您需要多个不相关的返回值,在这种情况下是状态和结果集。

标签: c# wcf web-services c#-4.0 wcf-client


【解决方案1】:

它似乎基于 WSDL 限制: http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/48b5992f-f7bd-4b67-8299-514d1780fa9a

WSDL 不显示原始方法签名;相反,它显示 输入参数作为一个组,输出参数作为另一个 组。

无法将返回值与输出参数分开的限制在 WSDL 中。但这意味着我认为 void 方法的限制将成为 svcutil.exe 的一部分。没有理由不能在 svcutil 上进行开关以不将第一个输出移动到返回值,但这将是对 ms connect 功能的请求。

如果您的问题是一致性,您可以返回一个简单的状态 int 或 bool 而不是 void,但如果您已经有几十种方法,我敢肯定这不是一个完美的答案。

【讨论】:

  • 几分钟前我偶然发现了同一个链接。实际上,它似乎是底层 WSDL 的限制。当然,包装器可以使用任何顺序,但我没有看到强制执行此操作的用例。我们将解决这些限制,然后,至少我们将使用 VoidResponse 类型暂时使重构更容易。
  • 关于 VoidResponse 类型的好主意。
猜你喜欢
  • 2014-06-20
  • 2020-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-28
  • 1970-01-01
  • 2011-12-01
  • 1970-01-01
相关资源
最近更新 更多