我有一个webmethod工作,它将一个字节数组返回给调用者:
public byte[] DownloadPDF(string URI)
我不得不改变它以返回另一个输出(字符串)。所以,我决定完全改变方法,现在返回void并有3个这样的参数:
public void DownloadFile(string URI, out byte[] docContents, out string returnFiletype)
我的Web服务正确编译但我怀疑第二个参数(即字节数组)有问题,因为当我“添加Web引用”并构建我的代理类时,该方法只有2个参数,而不是3):< / p>
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/DownloadFile", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
[return: System.Xml.Serialization.XmlElementAttribute("docContents", DataType="base64Binary")]
public byte[] DownloadFile(string URI, out string returnFiletype) {
object[] results = this.Invoke("DownloadFile", new object[] {
URI});
returnFiletype = ((string)(results[1]));
return ((byte[])(results[0]));
}
我不明白为什么我的第二个参数,即字节数组被忽略,但它似乎是问题的根源。
这当然会在Web客户端应用程序中让我感到困惑,我在编译时收到错误消息:
No overload for method 'DownloadFile' takes '3' arguments
以下是我需要传递3个参数的Web客户端中的代码:
myBrokerASMXProxy.ASMXProxy.FileService client = new myASMXProxy.ASMXProxy.FileService();
byte[] fileDataBytes;
string fileType;
client.DownloadFile(URI, fileDataBytes, fileType);
我正在考虑将其更改为返回一个字节数组并仅添加一个“out”参数,但我认为我应该向专家询问这一点,一般来说,处理多个输出要求的最佳做法是什么。 / p>
答案 0 :(得分:1)
不会忽略字节数组 - 而是将其作为返回类型。我不知道为什么会这样做,但在我看来它更有意义。我不会在void方法中使用参数。我怀疑代理生成器只接受带有out参数的任何方法,并将第一个转换为返回类型。
答案 1 :(得分:1)
为什么不尝试使用此签名:
public bool DownloadFile(string URI, out byte[] docContents, out string returnFiletype)
看看会发生什么?我同意Jon Skeet,但你仍然可以通过操作结果返回一个bool