【问题标题】:Byte array as an out parameter not recognized无法识别作为输出参数的字节数组
【发布时间】:2010-10-13 16:39:46
【问题描述】:

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

【问题讨论】:

    标签: c# parameters arguments return-value


    【解决方案1】:

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

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

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

    【讨论】:

    • OK.. 仍然不知道为什么,但是您建议的签名(返回布尔值)导致生成的代理类中的正确签名(即 1 个输入参数、一个字节数组输出和一个字符串输出) .这主要是风格还是多个输出的最佳实践?我本可以返回一个字节数组
    • 我认为,正如 Jon 所说,代理生成器针对较短的 SOAP 消息对其进行了优化,因此将第一个 out 参数作为返回类型代替 void 方法
    • 这似乎是一种变通方法,而不是一种解决方案——添加一个虚拟返回类型并不是特别干净。 (这是一个很好的实验,不要误会我的意思——我只是不想在现实生活中使用它。)
    • 好的,你提供的解决方案不同,而且也有效,乔恩,我也喜欢这个,...我只是尝试做更简单的方法签名,它不会导致代理生成器生成不同的方法,从长远来看这将是错误的。
    【解决方案2】:

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

    【讨论】:

    • 所以,您同意一种快速的解决方法是丢弃 void 返回并返回一个字节数组,而不是只留下 2 个参数:一个输入字符串和一个输出字符串)??
    • 是的,我就是这么做的。或者创建一个包含字符串和字节数组的新返回类型,这可能会更好一些(并且在没有“out”参数的语言中工作得更好,例如 Java)。
    猜你喜欢
    • 1970-01-01
    • 2018-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-21
    • 2013-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多