0

我有一个 webmethod 工作,它返回一个字节数组给调用者:

public byte[] DownloadPDF(string URI)

我不得不改变它以返回另一个输出(一个字符串)。所以,我决定完全改变方法,现在返回 void 并有 3 个参数,如下所示:

public void DownloadFile(string URI, out byte[] docContents, out string returnFiletype)

我的 Web 服务编译正确,但我怀疑第二个参数(即字节数组)有问题,因为当我“添加 Web 引用”并构建代理类时,该方法只有 2 个参数,而不是 3 个):

[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”参数,但我认为我应该就此向专家询问,一般来说,处理多个输出要求的最佳实践是什么。

4

2 回答 2

1

字节数组没有被忽略——而是被作为返回类型。我不知道它为什么这样做,但在我看来它更有意义。我不会在 void 方法中使用 out 参数。我怀疑代理生成器只是采用任何没有参数的方法并将第一个方法转换为返回类型。

于 2009-03-16T18:56:25.737 回答
1

你为什么不尝试把这个签名:

public bool DownloadFile(string URI, out byte[] docContents, out string returnFiletype)

看看会发生什么?我同意 Jon Skeet 的观点,但您仍然可以返回一个带有操作结果的 bool

于 2009-03-16T18:59:39.367 回答