我从我们的一位供应商那里收到了关于他们正在发布的一个Web服务的一些文档,他们非常明确地表示,在他们的某个WebMethod中,一个参数具有out修饰符(?不确定是否是正确的描述),例如请考虑以下WebMethod签名:
[WebMethod]
public void HelloWorld(out string strVal)
{
strVal = "Hello World";
}
[显然,实际方法并不是一个“Hello World”方法]
我从未考虑过设计一个带有out/ref参数的WebMethod,并且我想知道为什么他们会使用它。
为了理解这种设计决策的应用,我创建了一个原型,其中包括几个基本的“Hello World”样式的webmethod...一个带有单个out字符串参数,一个带有两个out字符串参数,以及一个不接收任何参数但返回一个字符串的webmethod。
当我尝试从另一个应用程序引用我的webmethods时,我注意到我必须像定义方法输出字符串一样访问带有单个out字符串参数的方法,以便在客户端看来:
public string HelloWorld1()
{
return "Hello World";
}
和
public void HelloWorld2(out string strVal)
{
strVal = "Hello World";
}
两者完全相同……在这种情况下,我必须将它们都称为如此 [其中 x 被替换为正确的方法]:
string val = HelloWorldX();
我试图以与访问非网络方法相同的方式引用这些方法,就像这样:
string val = string.Empty;
MyService1.HelloWorld(out val);
Console.WriteLine(val);
出现编译错误,指出没有方法参数可接受1个输入。为什么会这样呢?很明显有一个Web方法可以接受一个参数——我正在查看它[HelloWorld2]。
检查SOAP响应后,我注意到HelloWorld1响应的内容是:
<HelloWorld1Response xmlns="http://tempuri.org/">
<HelloWorld1Result>string</HelloWorld1Result>
</HelloWorld1Response>
而 HelloWorld2 则是:
<HelloWorld2Response xmlns="http://tempuri.org/">
<strVal>string</strVal>
</HelloWorld2Response>
进一步思考后,我想,如果有两个 ref 参数会怎样……
public void HelloWorld3(out string strVal1, out string strVal2)
{
strVal1 = "Hello World";
strVal2 = "Hello World Again!";
}
这将生成SOAP内容:
<HelloWorld3Response xmlns="http://tempuri.org/">
<strVal1>string</strVal1>
<strVal2>string</strVal2>
</HelloWorld3Response>
我认为这很公平,那么从理论上讲 [只要我能找到一种方法将ref参数传递给WebMethods] 这意味着我只需传入两个参数,这些参数可以由该方法设置,但当我这样做时:
string val1 = string.Empty;
string val2 = string.Empty;
MyService1.HelloWorld3(out val1,out val2);
Console.WriteLine(val1);
Console.WriteLine(val2);
我希望能看到与我以这种方式引用HelloWorld2时看到的相同编译错误。除了明显的异常,即它抱怨有两个参数而不是一个[实际上,我测试过它并且确实得到了相同的异常]。
- 为什么会出现这种情况?
- 是否存在在WebMethods中使用out/ref参数的原因或方法,我是否遗漏了什么?
- 如果存在,如何引用具有多个out/ref参数的WebMethods?