Domanda

Ho funzionato un metodo web che ha restituito un array di byte al chiamante:

public byte[] DownloadPDF(string URI)

Ho dovuto cambiare questo per restituire un altro output (una stringa). Quindi, ho deciso di cambiare completamente il metodo ora restituendo void e avendo 3 parametri come questo:

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

Il mio servizio web viene compilato correttamente ma sospetto che qualcosa non vada nel secondo parametro (vale a dire l'array di byte) perché quando "Aggiungi riferimento web" e costruisco la mia classe proxy, il metodo ha solo 2 parametri, non 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]));
    }

Non vedo perché il mio secondo parametro, l'array di byte, venga ignorato, ma sembra essere la fonte del problema.

Questo ovviamente mi fa incasinare l'app del client Web dove ricevo un messaggio di errore in fase di compilazione:

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

Ecco il codice nel client Web in cui devo passare 3 argomenti:

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

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

Sto pensando di cambiarlo indietro per restituire un array di byte e aggiungere un solo "out" parametro, ma ho pensato che avrei dovuto chiedere a voi esperti di questo e in generale qual è la migliore pratica per la gestione di più requisiti di output.

È stato utile?

Soluzione

Perché non provi a mettere questa firma:

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

Per vedere cosa succede? Sono d'accordo con Jon Skeet, ma puoi comunque restituire un bool con il risultato dell'operazione

Altri suggerimenti

L'array di byte non viene ignorato, ma viene inserito come tipo restituito. Non so perché lo stia facendo, ma secondo me ha più senso. Non userei i parametri in un metodo vuoto. Sospetto che il generatore di proxy prenda qualsiasi metodo senza parametri e trasforma il primo in un tipo restituito.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top