【问题标题】:Use/generate methods signatures with int[] insted of ArrayOfInt on .NET web service在 .NET Web 服务上使用/生成带有 int[] insted of ArrayOfInt 的方法签名
【发布时间】:2011-11-02 04:23:40
【问题描述】:

我有一个 ASP.NET Web 服务 (.asmx),其方法接收 int 数组 (int[]) 和可空的 int 数组 (int?[]) 作为参数。我还有一个测试 Web 应用程序,用于通过服务参考使用此 Web 服务。

问题在于,每次我更改 Web 服务代码中的某些内容、重新编译它并更新测试应用程序中的服务引用时,都会为测试应用程序上的 Web 服务方法生成不同类型的参数。例如:

在第一次构建和服务更新时,Visual Studio 在测试应用中生成的方法签名是:

void MyMethod(int[] firstParam, int?[] secondParam)

然后我做了一些改变,再做一次,得到类似的东西:

void MyMethod(ArrayOfInt fistParam, ArrayOfInt1 secondParam)

ArrayOfInt 相当于 int[]ArrayOfInt1 相当于 int?[])。

再一次,我得到:

void MyMethod(ArrayOfInt1 firstParam, ArrayOfInt secondParam),

交换了ArrayOfIntArrayOfInt1ArrayOfInt1 现在相当于int[]ArrayOfInt 相当于int?[])。



我真正想要的是使用简单的int[]int?[] 类型(无论我重新编译和更新服务引用多少次!)。我怎样才能做到这一点?

【问题讨论】:

  • 没人找到原因吗?没有人对这种愚蠢的行为感到恼火吗?
  • 您使用的是 ASP.NET (asmx) Web 服务还是 WCF?
  • 听起来你应该打开 WCF
  • 我正在使用 ASP.NET,但我还不能使用 WCF(出于业务原因)。
  • 傻,但是你可以通过创建自己的集合数组类并在方法中使用它作为参数来避免,编译器不会干预。

标签: c# .net asp.net web-services service-reference


【解决方案1】:

我知道这很旧,但我刚刚遇到了同样的问题。对我而言,不同之处在于添加了 Web 引用而不是服务引用。

在 VS 中,执行以下操作:

  1. 右击,选择添加>服务参考
  2. 点击左下角的高级按钮
  3. 点击左下角的添加网页参考按钮
  4. 添加 URL 和引用名称,然后单击 添加引用

我的网络参考正确添加了带有int[] 参数的方法。

编辑:Here 是一个更好的答案,用漂亮的图片来说明!

编辑 2: This answer 摆脱了 ArrayOfXXXList<XXX> 的愚蠢并且不使用传统技术,因此双赢正如我所担心的。现在,如何在工具中做到这一点?还是只有可以通过直接编辑文件来完成?

【讨论】:

  • 坏主意。尝试在“添加服务参考”中指定集合的​​类型。回到使用旧技术只是为了将int[] 作为参数类型是没有意义的。
  • 对于我的情况,它已经是一个 ASMX 文件,所以并不是真正的“倒退”——没有回头路可走。 OP 还谈到它是一个 ASMX 文件。如果我没有获得 WCF 的好处,我真的不明白为什么我需要担心它。如果我需要更多,我一开始就不会使用 ASMX。 :)
  • 不,您的 服务 是 ASMX。这不是 client 成为 ASMX 的理由。
  • 是的,但我的客户也没有理由成为 WCF。除了 ASMX 提供的东西之外,我不需要任何东西,而且“仅仅因为”不是一个足够好的理由。没有任何性能问题我必须担心可能会使 WCF 成为更好的选择,我没有任何安全问题可能 WCF 会变得更好,我没有任何真正的原因是 SOAP 在这里对我来说不能很好地工作。我是一个确实关心最佳实践的人,但也有机会不要为了它而过度设计 - 对我来说,这是其中之一。
  • WCF 将使用 SOAP。仅供参考,我建议的主要原因是:1)Microsoft 缺乏对 ASMX 错误和安全修复的支持,以及 2)当您想知道发生了什么时,打开 WCF 跟踪很容易。这只是一个配置更改。
【解决方案2】:

尝试使用 wsdl.exe 工具生成 Web 服务代理,而不是使用 Visual Studio。

这对我有用!

【讨论】:

  • 是什么让你认为这会解决他的问题?有没有遇到这个问题,然后用wsdl.exe解决了?
  • 是的,当我使用 wsdl.exe 时,我可以使用 int[] 代替 ArrayOfInt()。
  • 它工作正常,但我在 Visual Studio 中寻找解决方案。如果没有人为此提供解决方案,我会接受这个答案,因为我认为 Visual Studio 根本无法做到这一点。
  • 嗯,我认为在 Visual Studio 中没有解决方案......所以使用 wsdl.exe 作为一种解决方法可以很好地工作。感谢大家的努力!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多