Devolviendo un archivo binario desde el controlador en ASP.NET Web API



3 Answers

Para la API web 2 , puede implementar IHttpActionResult . Aquí está el mío:

using System;
using System.IO;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading;
using System.Threading.Tasks;
using System.Web;
using System.Web.Http;

class FileResult : IHttpActionResult
{
    private readonly string _filePath;
    private readonly string _contentType;

    public FileResult(string filePath, string contentType = null)
    {
        if (filePath == null) throw new ArgumentNullException("filePath");

        _filePath = filePath;
        _contentType = contentType;
    }

    public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
    {
        var response = new HttpResponseMessage(HttpStatusCode.OK)
        {
            Content = new StreamContent(File.OpenRead(_filePath))
        };

        var contentType = _contentType ?? MimeMapping.GetMimeMapping(Path.GetExtension(_filePath));
        response.Content.Headers.ContentType = new MediaTypeHeaderValue(contentType);

        return Task.FromResult(response);
    }
}

Entonces algo como esto en tu controlador:

[Route("Images/{*imagePath}")]
public IHttpActionResult GetImage(string imagePath)
{
    var serverPath = Path.Combine(_rootPath, imagePath);
    var fileInfo = new FileInfo(serverPath);

    return !fileInfo.Exists
        ? (IHttpActionResult) NotFound()
        : new FileResult(fileInfo.FullName);
}

Y aquí hay una forma en que puede decirle a IIS que ignore las solicitudes con una extensión para que la solicitud llegue al controlador:

<!-- web.config -->
<system.webServer>
  <modules runAllManagedModulesForAllRequests="true"/>
asp.net asp.net-mvc asp.net-web-api

Estoy trabajando en un servicio web utilizando el nuevo WebAPI de ASP.NET MVC que servirá archivos binarios, principalmente archivos .cab y .exe .

El siguiente método de controlador parece funcionar, lo que significa que devuelve un archivo, pero está configurando el tipo de contenido en application/json :

public HttpResponseMessage<Stream> Post(string version, string environment, string filetype)
{
    var path = @"C:\Temp\test.exe";
    var stream = new FileStream(path, FileMode.Open);
    return new HttpResponseMessage<Stream>(stream, new MediaTypeHeaderValue("application/octet-stream"));
}

¿Hay una mejor manera de hacer esto?




Para cualquier persona que tenga el problema de que se llame más de una vez a la API mientras descarga un archivo bastante grande con el método de la respuesta aceptada, configure el búfer de respuesta en verdadero System.Web.HttpContext.Current.Response.Buffer = true;

Esto asegura que todo el contenido binario se almacena en el búfer antes de enviarlo al cliente. De lo contrario, verá una solicitud múltiple que se envía al controlador y, si no la maneja correctamente, el archivo se dañará.




Tu podrías intentar

httpResponseMessage.Content.Headers.Add("Content-Type", "application/octet-stream");



Related