gpt4 book ai didi

c# - .Net WebServices 和 out/ref WebMethod 参数

转载 作者:可可西里 更新时间:2023-11-01 08:40:11 25 4
gpt4 key购买 nike

我从我们的供应商之一那里收到了一些他们正在发布的网络服务的文档,他们非常具体地指出,在他们的一个 WebMethods 上,一个参数有 out 修饰符(?不确定这是否是正确的描述符)例如考虑以下 WebMethod 签名:

[WebMethod]
public void HelloWorld(out string strVal)
{
strVal = "Hello World";
}

[显然实际方法不是 Hello World 方法]

现在,我从未考虑过设计带有 out/ref 参数的 WebMethod,这让我想知道他们为什么会使用它。

为了理解这个设计决定的应用,我将一个原型(prototype)和一些基本的 Hello World 风格的网络方法放在一起......一个有一个输出字符串参数,一个有两个输出字符串参数,一个不接收任何字符串参数参数,但返回一个字符串。

在尝试从单独的应用程序引用我的 webmethods 时,我注意到我必须使用单独的字符串参数访问该方法,就像我定义了输出字符串的方法一样,以便在客户端有效关注点:

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>

我想更进一步,如果我有 2 个 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>

我认为很公平,所以理论上 [假设我可以想出一种方法将参数传递给 WebMethods] 这意味着我可以只传递两个可以由该方法设置的参数,但是当我这样做时:

string val1 = string.Empty;
string val2 = string.Empty;
MyService1.HelloWorld3(out val1,out val2);
Console.WriteLine(val1);
Console.WriteLine(val2);

我应该得到与我尝试以这种方式引用 HelloWorld2 时看到的相同的编译错误。明显的异常(exception)是它提示 2 个参数而不是 1 个 [事实上我确实得到了相同的异常,我测试了它]。

  • 什么给了?
  • 在 WebMethods 中使用 out/ref 参数是否有我遗漏的原因或方法?
  • 如果有,我如何使用多个 out/ref 参数引用 WebMethods?

最佳答案

我不知道为您自己的问题提供答案的协议(protocol)是什么,但 Steven Behnke 引用的文章为我提供了一些线索来推断出解决这种奇怪情况的方法。我想分享我的发现,而不是让其他人去弄清楚这意味着什么。

因此,请考虑在我的 Web 服务中定义的以下 Web 方法:

[WebMethod]
public string Method1()
{
return "This is my return value";
}

[WebMethod]
public void Method2(out string strVal1)
{
strVal1 = "This is my value passed as an output";
//No return value
}

[WebMethod]
public void Method3(out string strVal1, out string strVal2)
{
strVal1 = "This is my strVal1 value passed as an output";
strVal2 = "This is my strVal2 value passed as an output";
//No return value
}

[WebMethod]
public string Method4(out string strVal1, out string strVal2)
{
strVal1 = "This is my strVal1 value passed as an output";
strVal2 = "This is my strVal2 value passed as an output";
return "This is my return value";
}

现在根据文档,第一个参数定义为Out,如果方法返回void,那么第一个参数自 Action 为返回参数。所以我会按如下方式访问我的每个方法:

方法一:

public string Method1() {}

var str = svc.Method1();
Console.WriteLine(str);

方法二:

public void Method2(out string strVal1) {}

var str = svc.Method2();
Console.WriteLine(str);

因此您以完全相同的方式访问它们,这非常令人困惑。地球上谁会在没有被其他人告知的情况下弄清楚这一点?我无法理解,这怎么可能是个好主意。

方法三:

public void Method3(out string strVal1, out string strVal) {}

var str2 = String.Empty;
var str1 = svc.Method3(out str2);
Console.WriteLine(str1);
Console.WriteLine(str2);

方法4:

public string Method4(out string strVal1, out string strVal2) {}

var str1 = String.Empty;
var str2 = String.Empty;
var str3 = svc.Method4(out str1, out str2);
Console.WriteLine(str1);
Console.WriteLine(str2);
Console.WriteLine(str3);

正如您注意到的那样 - 如果方法签名不提供返回值 [即返回 void],那么第一个参数将成为返回值。如果它已经提供了返回值,则不会。

对于没有接触过该文档的人来说,这可能会非常令人困惑。非常感谢史蒂文提供该链接 - 我真的很感激。

对于任何认为将设计模式写入 .NET Framework 是一个好主意的人 - 我想不出是什么让您认为这是一个好主意。毕竟我真的非常讨厌你。

附录:

我才刚刚意识到的是,如果你使用 ref 而不是 out 那么你会更加困惑这样,您将完全按照使用 WebMethods 来调用应用程序中的常规方法的方式对待 WebMethods:

[WebMethod()]
public void Method3(ref string strVal1, ref string strVal2)
{
strVal1 = "First argument return value";
strVal2 = "Second argument return value";
}

现在调用你会使用的:

string val1 = String.Empty;
string val2 = String.Empty;
svc.Method3(ref val1, ref val2);
Console.WriteLine(val1);
Console.WriteLine(val2);

这种不一致令人难以置信。事实上,这是设计使然,这对我来说是不可理解的。

关于c# - .Net WebServices 和 out/ref WebMethod 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/379648/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com