2013-11-21 12 views
6

Ich arbeite an einem kleinen Projekt, bei dem Nancy von einer WPF-Anwendung gehostet wird. Ich möchte in der Lage sein, eine PDF-Datei, die ca. 8 MB groß ist, aus der Ferne herunterzuladen. Ich konnte den Download zum Laufen bringen, aber während des Downloads läuft die Anwendung nicht auf andere Anfragen. Gibt es eine Möglichkeit, den Dateidownload zuzulassen, ohne alle anderen Anfragen zu binden?Dateidownloads in einer Nancy-Anwendung für den Selbsthost

Public Class ManualsModule : Inherits NancyModule 
    Public Sub New() 
     MyBase.New("/Manuals") 

     Me.Get("/") = Function(p) 
      Dim model As New List(Of String) From {"electrical", "opmaint", "parts"} 
      Return View("Manuals", model) 
     End Function 

     Me.Get("/{name}") = Function(p) 
      Dim manualName = p.name 
      Dim fileResponse As New GenericFileResponse(String.Format("Content\Manuals\{0}.pdf", manualName)) 
      Return fileResponse 
     End Function 
    End Sub 
End Class 

Oder in C#

public class ManualsModule : NancyModule 
{ 
    public ManualsModule() : base("/Manuals") 
    { 
     this.Get("/") = p => 
     { 
      List<string> model = new List<string> { 
       "electrical", 
       "opmaint", 
       "parts" 
      }; 

      return View("Manuals", model); 
     }; 

     this.Get("/{name}") = p => 
     { 
      dynamic manualName = p.name; 
      GenericFileResponse fileResponse = new GenericFileResponse(string.Format("Content\\Manuals\\{0}.pdf", manualName)); 
      return fileResponse; 
     }; 
    } 
} 

Antwort

3

fand ich, dass ich eigentlich Nancy in WCF nicht selbst Host wurde Hosting. Das beschriebene Verhalten tritt nur auf, wenn es in WCF gehostet wird. Self-Host funktioniert gut für meine Anwendung, also werde ich damit gehen.

+0

das Problem ist wahrscheinlich WCFs arkanen Konfiguration um maximale Nachrichtengrößen - aber wenn selbst Gastgeber für Sie arbeitet, das ist eine bessere Option sowieso imo :) –

10
var file = new FileStream(zipPath, FileMode.Open); 
string fileName = //set a filename 

var response = new StreamResponse(() => file, MimeTypes.GetMimeType(fileName)); 
return response.AsAttachment(fileName); 
+1

Dumme Frage: Da Sie den Stream vor der Return-Anweisung nicht schließen können - wird der Stream automatisch geschlossen, nachdem Nancy damit fertig ist? Ich denke, es ist in Ordnung .. – RhinoDevel

+1

** Der Stream sollte von der Stellvertretung erstellt werden. ** Das ist wahrscheinlich der Grund, warum die 'StreamResponse' eine Aktion und kein Stream-Objekt benötigt:' new StreamResponse (() => new FileStream (zipPath, FileMode.Open), MimeTypes.GetMimeType (Dateiname)); ' – JanDotNet

2

Der einfachste Weg ist es, eine Stream um es zu schaffen, wie folgt aus:

var response = new Response(); 

response.Headers.Add("Content-Disposition", "attachment; filename=test.txt"); 
response.ContentType = "text/plain"; 
response.Contents = stream => { 
    using (var writer = new StreamWriter(stream)) 
    { 
     writer.Write("Hello"); 
    } 
}; 

return response; 
0

Monivs Antwort funktioniert gut, wenn Sie die Datei als attachement wollen, wenn Sie die PDF direkt öffnen möchten, in der Browser können Sie es wie folgt tun:

MemoryStream ms = new MemoryStream(documentBody); 
var response = new Response(); 
response.ContentType = "application/pdf"; 
response.Contents = stream => { 
    ms.WriteTo(stream); 
}; 
return response;