Devolución de archivo binario del controlador en ASP.NET Web API



Answers

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

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 manera 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"/>
Question

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

El siguiente método de control parece funcionar, lo que significa que devuelve un archivo, pero está configurando el tipo de contenido para 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?




La sobrecarga que está utilizando establece la enumeración de formateadores de serialización. Debe especificar el tipo de contenido explícitamente como:

httpResponseMessage.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");



Tu podrías intentar

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



Related