Pergunta

Eu tinha um trabalho webmethod que retornou um array de bytes para o chamador:

public byte[] DownloadPDF(string URI)

Eu tive que mudar isso para voltar outra saída (a string). Então, eu decidi mudar o método completamente até agora retornar void e ter 3 parâmetros como este:

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

O meu serviço web compila corretamente, mas eu suspeito que algo está errado com o segundo parâmetro (ou seja, a matriz de bytes) porque quando eu "Add Web Reference" e construir minha classe proxy, o método tem apenas 2 parâmetros, não 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]));
    }

Eu não vejo por que meu segundo parâmetro, o array de bytes, está sendo ignorada, mas que parece ser a fonte do problema.

Isto, obviamente, messes-me para o aplicativo cliente web onde eu recebo uma mensagem de erro em tempo de compilação:

No overload for method 'DownloadFile' takes '3' arguments

Aqui está o código no cliente web onde eu preciso passar 3 argumentos:

myBrokerASMXProxy.ASMXProxy.FileService client = new myASMXProxy.ASMXProxy.FileService();

        byte[] fileDataBytes;
        string fileType;
        client.DownloadFile(URI, fileDataBytes, fileType);

Estou pensando em mudar-lo de volta para retornar um array de bytes e adicionar apenas um único "fora" parâmetro, mas eu pensei que eu deveria pedir-lhe especialistas sobre esta e, em geral, qual é a melhor prática para lidar com vários requisitos de saída.

Foi útil?

Solução

Por que não a sua tentativa de colocar essa assinatura:

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

Para ver o que acontece? Concordo com Jon Skeet, mas você ainda pode pode retornar um bool com o resultado da operação

Outras dicas

A matriz de bytes não está sendo ignorada - ele está sendo colocado como o tipo de retorno em seu lugar. Eu não sei por que ele está fazendo isso, mas faz mais sentido na minha opinião. Eu não usaria os parâmetros em um método vazio. Eu suspeito que o gerador de proxy só tem qualquer método com os parâmetros e vira o primeiro em um tipo de retorno.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top