使用C#中的可选参数从Web引用调用WebMethod

时间:2011-10-28 14:29:59

标签: c# web-services asmx optional-parameters

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

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

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

在WSDL中,它确实以minvalue 0和maxvalue 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中使用带有可选参数的webservices,而不会被强制为NULL,每次调用都会有几十个可选参数?我们希望继续在Visual Studio中使用方便的Web引用,而不必一直强制执行此操作。

4 个答案:

答案 0 :(得分:3)

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

如果您希望为服务调用提供可选参数,则需要使用您自己的代码覆盖生成的存根方法,如果您希望客户端感觉可选参数。

答案 1 :(得分:1)

minOccurs = 0指的是变量的出现。由于它的类型为字符串minOccurs = 0,因为它具有默认值。

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

答案 2 :(得分:1)

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

这是IMO比方法重载更好的解决方案,它甚至不能与Web服务一起使用。您必须为每个重载创建一个新的略有不同的方法。

答案 3 :(得分:0)

我猜重构方法接受具有十几个可空属性(而不是十几个参数)的结构将会产生。