2009-03-16 4 views
0

hatte ich einen Webmethod arbeiten, das ein Byte-Array an den Aufrufer zurückgegeben:Byte-Array als out-Parameter nicht erkannt

public byte[] DownloadPDF(string URI) 

Ich hatte dieses einen anderen Ausgang zurück zu ändern (eine Zeichenkette). Also entschied ich mich nun das Verfahren vollständig zu ändern, indem Leere zurückkehrt und mit 3 Parameter wie folgt aus:

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

Meine Web-Service stellt richtig, aber ich vermute, etwas falsch ist mit dem zweiten Parameter (dh die Byte-Array), weil, wenn I "Add Web Reference" und meine Proxy-Klasse bauen, hat das Verfahren nur zwei Parameter, nicht 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])); 
    } 

ich sehe nicht, warum mein zweiter Parameter, der Byte-Array, ignoriert wird, aber es scheint die Ursache des Problems zu sein.

Dies natürlich vermasselt mich im Web-Client-Anwendung, wo ich eine Fehlermeldung bei der Kompilierung erhalten:

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

Hier ist der Code in dem Web-Client ist, wo ich drei Argumente zu übergeben:

Ich denke daran, es zurück zu ändern, um ein Byte-Array zurückzugeben und nur einen einzigen "out" -Parameter hinzuzufügen, aber ich dachte, ich sollte Sie Experten fragen und im Allgemeinen, was ist die beste Praxis für die Handhabung mehrerer Ausgabeanforderungen .

Antwort

1

Warum setzen Sie nicht Ihre try diese Signatur:

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

Um zu sehen, was passiert? Ich stimme Jon Skeet zu, aber Sie können immer noch eine Bool mit dem Ergebnis der Operation

+0

OK..noch nicht sicher, warum, aber Ihre vorgeschlagene Signatur (Rückgabe eines bool) führte zu der richtigen Signatur in der generierten Proxy-Klasse (d. H. 1 Eingabe-Parm, eine Byte-Array-Ausgabe und eine String-Ausgabe). Ist das hauptsächlich Stil oder gibt es eine Best Practice für mehrere Ausgaben? Ich könnte ein Bytearray zurückgegeben haben –

+0

Ich denke, wie Jon sagte, der Proxy-Generator optimiert es für kürzere SOAP-Nachrichten, so setzen Sie den ersten Parameter als Rückgabetyp instaead der void-Methode –

+0

Dies scheint eher ein Workaround als eine Lösung - das Hinzufügen eines Dummy-Rückgabetyps ist nicht besonders sauber. (Es war ein gutes Experiment zu führen, versteh mich nicht falsch - ich würde es einfach nicht im wirklichen Leben benutzen wollen.) –

1

Das Byte-Array wird nicht ignoriert - es wird stattdessen als Rückgabetyp angegeben. Ich weiß nicht, warum es das macht, aber es macht meiner Meinung nach mehr Sinn. Ich würde Parameter in einer void-Methode nicht verwenden. Ich vermute, dass der Proxy-Generator nur irgendeine Methode mit out-Parametern verwendet und die erste in einen Rückgabetyp umwandelt.

+0

zurückgeben So stimmen Sie eine schnelle Abhilfe wäre die void zurückwerfen und Rückgabe einer Byte-Array anstatt nur 2 Parameter: eine Eingabe String und One Out String) ?? –

+0

Ja, das würde ich tun. Oder erstellen Sie einen neuen Rückgabetyp, der eine Zeichenfolge und ein Byte-Array enthält, was etwas netter sein könnte (und besser aus Sprachen ohne "out" -Parameter wie Java funktioniert). –