[geloest]WSE2 DIME Attachment extrahieren und in Zielordner kopieren
-
Kurz zum Programm:
Es kommt eine SOAP Nachricht mit einem Attachment (in diesem Fall ein GIF) und eben dieses Attachment soll dann in einen Ordner kopiert werden. Das habe ich mangels weiterer Ideen so versucht:
String *path = new String("C:\\temp\\test"); DirectoryInfo* di = new DirectoryInfo(path); log->add(S"Initialisierungen String und DirInfo"); FileInfo* fi = new FileInfo(RequestSoapContext::Current->Attachments->get_Item(0)->ToString()); fi->CopyTo(path); log->add("Recieve File erfolgreich durchgeführt");
Das funktioniert scheinbar nicht und sieht auch nicht wirklich sinnig aus. Der Client überträgt zwar etwas, der Server beschwert sich auch nicht, aber am gewünschten Ort taucht kein File auf und das Logfile endet mit "Initiialisierungen und DirInfo", also bricht es beim FileInfo Konstruktor wohl mangels Erfolg ab. Ich hatte gehofft, wenn ich ein FIleInfo Objekt draus mache, könnte ich eventuell über den Dateinamen Zugriff auf die ursprgl. Datei bekommen. Scheint aber so nicht zu klappen.
Wie komme ich an das Attachment so heran, dass ich es wie ein File behandeln kann, also irgendwohin kopieren etc.? Ich bin Dankbar für jede Idee.
-
Du musst die Daten ja irgendwo haben, oder zumindest als Stream vorliegen...
Zum schreiben würde ich ein FileStream verwenden und dann eben mit "Write" scheiben...
-
Also eine leere Datei, z.B. name.gif erstellen, und diese dann per Write mit dem Stream aus dem Attachment füllen um diese dann anschliessend an den gewünschten Ort zu kopieren?
-
Ja... oder liegt das Bild schon als Datei vor? Normalerweise doch nicht, oder? Es ist ja nur in der SOAP-Message drin... Deshalb musst Du sie zuerst lokal speichern und dann an eine passende Stelle verschieben...
-
Es ist als DIME Attachment an die SOAP Message angehängt, läuft so ähnlich wie MIME bei E- Mails. Wie das in der inneren Repräsentation aussieht, weiss ich nicht genau. Jedenfalls wird es nicht binär innerhalb des Soap Envelopes geschrieben, sondern die Datei wird in ihrem Originalzustand belassen. Hier mal ein Beispiel von MS, wie die eine solche Datei extrahieren (allerdings C# in einer WinForms PictureBox):
private void btnGetImage_Click(object sender, System.EventArgs e) { MyDimeServiceWse svc = new MyDimeServiceWse(); svc.CreateDimedImage(); //oben: Anfrage an Server der ein Bild senden soll if (svc.ResponseSoapContext.Attachments.Count == 1) { //Der Picture Box wird der Stream von Attachment[0] zugewiesen pbDime.Image = new Bitmap( svc.ResponseSoapContext.Attachments[0].Stream); } }
Bei mir läuft's nur andersherum (Server bekommt Bild), sollte in diesem Zusammenhang aber egal sein.
-
Falls irgendwann mal wer vor dem selben Problem steht:
[WebMethod] void RecieveFile(void) { Clog *log; log = new Clog("c:\\temp\\logfiles\\logfile.txt"); log->add(S"Logfile angelegt"); //Exceptionkrams C_xmlexcept xexc; //Auf alles andere als SOAP nicht reagieren if (RequestSoapContext::Current==0) { log->add(S"Keine gueltige SOAP anfrage!"); throw new ApplicationException(S"Nur SOAP Anfragen erlaubt"); } else log->add(S"SOAP Anfrage erhalten!"); //Wenn kein Attachment mitkommt auch erstmal motzen if (RequestSoapContext::Current->Attachments->Count == 0) { log->add(S"Kein Attachment übertragen!"); throw new ApplicationException(S"Kein Attachment vorgefunden!"); } try { String *path = new String("C:\\temp\\test"); DirectoryInfo* di = new DirectoryInfo(path); //Erstmal möglichst grosszügig bleiben FileStream* fs = new FileStream("c:\\temp\\test\\mine.gif", FileMode::Create, FileAccess::ReadWrite, FileShare::ReadWrite); //Dem Stream s den Inhalt des Attachments zuweisen. Stream *s = RequestSoapContext::Current->Attachments->get_Item(0)->Stream; //ein byte Array begründen, welches die Länge s hat Byte bytes __gc[] = new Byte __gc[s->Length]; //s in bytearray einlesen, danach s schliessen s->Read(bytes,0,s->Length); s->Read(bytes,0,bytes->Length); s->Close(); log->add(S"Stream in byte Array geschrieben"); //Inhalt von s dem FileStream übergeben und in die Datei schreiben. fs->Write(bytes,0, bytes->Length); fs->Close();
Ich weiss...da kann man immer noch was verbessern und der FilseStream Konstruktor ist so auch suboptimal. Aber darum ging es gar nicht. Wenn einer ne möglichkeit findet, irgedetwas effizienter zu gesatlten, möge er die bitte mitteilen.