2009-05-14 1 views
0

Ich habe ein irritierendes Problem, ich erstelle einen asp.net Web Service; Dieser Dienst sollte die Funktionalität einer vorhandenen Bibliothek verfügbar machen. Der Dienst ermöglicht Benutzern das Hochladen von Dateien auf unseren Server durch Aufrufen der UploadFile-Methode für den Dienst. Hier ist die Signatur der Methode Upload
Typ Konflikte mit ITSELF, nur weil es als Rückgabetyp einer Webmethode in einem ASP.NET-Webdienst enthalten ist?

public bool UploadFile(string bucketName, string desiredFileName, System.IO.Stream fileData) 


Nun, wenn ich versuchen, diese Methode aufzurufen und geben es ein System.IO.Stream Objekt in die Datei bezieht hochgeladen werden, erhalte ich eine Kompilierzeitfehler, der angibt, dass der übergebene Typ (System.IO.Stream) nicht der erwartete Typ (Mynamespace.ServiceReference.Stream) ist. Ich habe versucht, meinen Stream explizit auf den Typ (Mynamespace.ServiceReference.Stream) zu setzen, aber der Compiler hat es mir auch nicht erlaubt, obwohl sie vom selben Typ sind! verheiratet!

+0

Ich glaube, ich bin mehr zu Liyod Antwort angezogen, so, akzeptiert! – Galilyou

Antwort

2

Das Problem ist, um die WSDL der Stream wird versuchen, serialisiert werden, was es nicht tun kann.

Ihre ursprüngliche Idee von einem Byte [] ist der richtige Weg, es zu tun.

Sie müssen sich nicht um die Base64-Konvertierung kümmern, da die ASP.NET-Laufzeitumgebung dies bereits für Sie erledigt.

+0

Also keine Möglichkeit, einen System.IO.Stream zu übergeben, wie der Dienst es erfordert! und warum war dieser Konflikt überhaupt? – Galilyou

+0

Der Konflikt lag daran, dass der WSDL-Generator/Importer versucht, einen serialisierbaren Typ aus System.IO.Stream zu erstellen. Um dies in Aktion zu sehen, erstellen Sie eine Dummy-Klasse, Bob, und fügen Sie Methode in Ihrem Web-Service, die Benutzer oder gibt es zurück. Sie sollten wo möglich bei primitiven Typen und Strukturen bleiben. – Lloyd

0

Hier ist die Lösung.

Anstelle von Byte [] im Argument für Dateidaten verwenden Sie die base64-String-Repräsentation des Bytes [].

vom Client, der Ihren Webservice konsumiert, lassen Sie ihn die Zeichenfolge byte [] in base64 umwandeln und leiten Sie diese an Ihren Webservice-Aufruf weiter. Am Serverende sollten Sie die Base64-Zeichenfolge des Bytearrays empfangen und diese in Byte [] konvertieren.

Hier finden Sie die Referenzen für Konvertierungsmethoden im .Net Framework.

From byte[] to Base64 - Für den Einsatz in webservice Kunden

Linktext: http://msdn.microsoft.com/en-us/library/dhx0d524.aspx

From Base64 to byte[] - Für den Einsatz in webservice Server

Linktext: http://msdn.microsoft.com/en-us/library/system.convert.frombase64string.aspx

+0

Also keine Möglichkeit, einen System.IO.Stream zu übergeben, wie es der Dienst erfordert! und warum war dieser Konflikt überhaupt? – Galilyou

+0

Der Dateistream ist immer nur auf einem einzelnen Computer verfügbar. Wir können streamReader oder streamWriter nicht remote für die Datei-E/A verwenden. Vorher muss ein NetworkStream vorhanden sein, um die Daten austauschen zu können, und dann über einen lokalen Dateistream verfügen, um diese Daten zu schreiben. –

Verwandte Themen