在c#中从带有可选参数的web引用中调用WebMethod

本文关键字:web 引用 调用 WebMethod 参数 | 更新日期: 2023-09-27 18:12:36

我使用。net Webservices创建了一个带有2个可选参数的虚拟web服务,但在实际产品中,我们将拥有更多可选参数(想想:查询的过滤器)。问题是,在调用web服务时不可能省略可选参数,这意味着在针对实际web服务进行开发时,每次调用web服务时都可能存在数十个NULL值。

现在这个虚拟的webservice只包含这个,以支持2个可选的字符串参数:

[WebMethod]
public string HelloWorld(String PARAM_1="", String PARAM_2="")
{   return "";   }

在WSDL中,它确实以最小值0和最大值1显示这些参数:

<s:element minOccurs="0" maxOccurs="1" name="PARAM_1" type="s:string"/>
<s:element minOccurs="0" maxOccurs="1" name="PARAM_2" type="s:string"/>

问题在于:当在Visual Studio 2010中通过web引用添加这个web服务时,它确实会用HelloWorld方法创建服务对象。但是,它不考虑可选参数。它创建了一个没有可选参数的HelloWorld函数。它总是需要PARAM_1和PARAM_2,所以可选参数必须用null填充,而不管我们实际想要使用哪个。

VS2010从web参考中生成的定义是这样的,显示了问题:

public string HelloWorld(string PARAM_1, string PARAM_2) {
object[] results = this.Invoke("HelloWorld", new object[] { PARAM_1, PARAM_2});

是否有一种方法可以在VS2010中使用带有可选参数的web服务,而不必在每次调用时强制为空潜在的数十个可选参数?我们希望继续在Visual Studio中使用方便的web引用,而不是一直被迫这样做。

在c#中从带有可选参数的web引用中调用WebMethod

可选参数是特定于语言的结构。基于soap的web服务对可选参数一无所知,因为基于soap的web服务与语言无关。

如果您想为服务调用提供一个可选参数,如果您想要客户端可选参数的感觉,则需要用自己的代码重写生成的存根方法。

如果将所有参数包装在一个单独的类中,则可以创建可选参数。这表示一条新消息,您可以自行决定是否将某些属性设置为可选属性。您还可以在分部类声明中为服务生成的类提供不同的构造函数。

在我看来,这是一个比方法重载更好的解决方案,方法重载甚至不能与web服务一起工作。您必须为每个重载创建一个新的稍微不同的方法。

minOccurs = 0表示变量的出现次数。因为它的类型是字符串minOccurs = 0,因为它将有一个默认值

您可以尝试使用不同类型的可选参数并检查wsdl.

我想重构方法来接受具有十几个可空属性(而不是十几个参数)的结构将是有意义的。