Entwickler-Ecke

Verteilte Systeme - Exceldatei von WCF zurückliefern


GeraldVonRiva - Di 05.07.16 12:34
Titel: Exceldatei von WCF zurückliefern
Hallo,

ich versuche gerade mit WCF einen Restful Webservice zu bauen. Dieser soll dem Client (Browser) ein Excelfile zurückliefern. Ich habe den Service so weit definiert das er ein Excelfile als Stream zurück sendet und der Browser auch einen Downloadlink öffnet. Jedoch ist die Exceldatei nach dem Download defekt.
Hat vllt jemanden einen Tipp, wieso die Datei defekt ankommt?

mfg

Gerald


Christian S. - Di 05.07.16 13:45

Hallo und :welcome:!

Vermutlich wird es leichter sein, Dir zu helfen, wenn Du auch noch relevanten Code zeigst.

Viele Grüße
Christian


GeraldVonRiva - Di 05.07.16 14:13

Hallo

Also ich habe eine Interface Datei in der eine Get Anfrage an den Service verarbeitet wird.


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
[ServiceContract]
public interface ISearch
{

    [OperationContract]
    [WebGet(ResponseFormat = WebMessageFormat.Json)]
    byte[] DownloadFile2();
}


Dort wird auf die Funktion in meiner Search.cs Klasse weitergeleitet.


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
    public byte[] DownloadFile2()
    {
        if (WebOperationContext.Current == nullthrow new Exception("weboperationcontext not set");

        ExcelPackage exl = new ExcelPackage();

        ExcelWorksheet wsh = exl.Workbook.Worksheets.Add("tabelle1");

        wsh.Cells[11].Value = "company name";
        wsh.Cells[12].Value = "address";
        wsh.Cells[13].Value = "status";

        WebOperationContext.Current.OutgoingResponse.ContentType = "application/octet-stream";
        WebOperationContext.Current.OutgoingResponse.Headers.Add("content-disposition""inline; filename=tes.xlsx");

        return exl.GetAsByteArray();
    }


In dieser Methode wird die Exceldatei im Speicher erzeugt und als Byte Array zurückgesendet. Der Downloadlink funktioniert im Browser, aber leider kann die Exceldatei nicht geöffnet werden. Dort kommt dann der Fehler Datei beschädigt.

mfg


Ralf Jansen - Di 05.07.16 14:21

Entscheidend dürfte die Implementierung von ExcelPackage.GetAsByteArray() sein die wir nicht kennen. Liefert die was gültiges?


GeraldVonRiva - Di 05.07.16 14:32

Ja die Funktion liefert einen Array mit Werten zurück, das wurde schon überprüft. Zur Erstellung der Exceldatei soll die Libary EPPlus genutzt werden, welche die Funktion ExcelPackage.GetAsByteArray() schon implementiert hat.


Ralf Jansen - Di 05.07.16 14:46

Zitat:
Ja die Funktion liefert einen Array mit Werten zurück, das wurde schon überprüft.


Sicher? Ich habe mir mal die Implementierung von Save (also speichern in ein File) angesehen. Und die machen noch ein paar Vorbereitungsmaßnahmen bevor die dort selbst GetAsByteArray aufrufen.
Gefühlt müßtest du das auch tun.

Ich würde dir empfehlen einfach bevor du das Ding per Wcf über die Leitung jagst die auf auf dem Wcf Server auch in ein File zu schreiben und dann einfach mal ein File Compare zwichen den beiden Versionen zu machen. Das Diff sollte verdeutlichen wo das Problem liegt.


GeraldVonRiva - Mi 06.07.16 12:45

Hallo,

bei nächster Gelegenheit werde ich mir mal die save Methode des Frameworks genauer anschauen. Das Thema hat sich durch eine Änderung der Projektanforderung erstmal erledigt.

Ich danke für die Tipps.

mfg

Gerald