Sto cercando di rendere un file ASP.Net 5 MVC 6 WebAPI un file, in risposta a una richiesta HttpGET.MVC 6 WebAPI restituisce HttpResponseMessage serializzato anziché il flusso di file
Il file proviene da una condivisione di file di Azure, ma potrebbe essere qualsiasi flusso contenente un file binario.
Mi sembra che MVC serializzi l'oggetto risposta e restituisca il JSON risultante, anziché restituire l'oggetto risposta stesso.
Ecco il mio metodo di controllo:
[HttpGet]
[Route("GetFile")]
public HttpResponseMessage GetFile(string Username, string Password, string FullName)
{
var client = new AzureFilesClient.AzureFilesClient(Username, Password);
Stream azureFileStream = client.GetFileStream(FullName).Result;
var fileName = Path.GetFileName(FullName);
using (HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK))
{
response.Content = new StreamContent(azureFileStream);
response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = fileName };
return response;
}
}
Il metodo GetFileStream sul AzureFilesClient è qui, anche se la fonte di flusso potrebbe essere qualsiasi cosa che contiene il contenuto del file binario:
public async Task<Stream> GetFileStream(string fileName)
{
var uri = new Uri(share.Uri + "/" + fileName);
var file = new CloudFile(uri, credentials);
using (var stream = new MemoryStream())
{
await file.DownloadToStreamAsync(stream);
stream.Seek(0, SeekOrigin.Begin);
return stream;
}
}
Edit: Ecco un esempio della risposta JSON:
{
"Version": {
"Major": 1,
"Minor": 1,
"Build": -1,
"Revision": -1,
"MajorRevision": -1,
"MinorRevision": -1
},
"Content": {
"Headers": [
{
"Key": "Content-Type",
"Value": [
"application/octet-stream"
]
},
{
"Key": "Content-Disposition",
"Value": [
"attachmentx; filename=\"samplefile.docx\""
]
}
]
},
"StatusCode": 200,
"ReasonPhrase": "OK",
"Headers": [],
"RequestMessage": null,
"IsSuccessStatusCode": true
}
Buona risposta, e funziona ancora. Il team AspNet ha implementato la propria soluzione FileStreamResult: FileResult: ActionResult, ma non lo ha reso disponibile nello spazio dei nomi System.Net.Http utilizzato da ApiController. Quindi ecco la fonte se ti piacerebbe usarlo: http://aspnetwebstack.codeplex.com/SourceControl/latest#src/System.Web.Mvc/FileResult.cs – OzBob
Questa è la soluzione che funziona bene per me, ma io Sono ancora confuso su ciò che alla fine chiude il flusso. Viene appena eliminato dalla garbage collection? O dovrebbe essere chiuso alla fine del metodo ExecuteResultAsync? –
Come hai trovato le prestazioni con file di grandi dimensioni (~ 500mb)? Sto riscontrando problemi con connessioni più lente che scendono dopo ~ 200mb. Le connessioni più veloci non hanno alcun problema. – rolls