从 ASP.NET Web API 中的控制器返回二进制文件

问题描述

尝试使用一个简单HttpResponseMessageContent属性设置为 aStreamContent

// using System.IO;
// using System.Net.Http;
// using System.Net.Http.Headers;

public HttpResponseMessage Post(string version, string environment,
    string filetype)
{
    var path = @"C:\Temp\test.exe";
    HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
    var stream = new FileStream(path, FileMode.Open, FileAccess.Read);
    result.Content = new StreamContent(stream);
    result.Content.Headers.ContentType = 
        new MediaTypeHeaderValue("application/octet-stream");
    return result;
}

关于使用的一些注意事项stream

  • 您不能调用,因为 Web API 在处理控制器方法以将数据发送回客户端stream.dispose()时仍然需要能够访问它。result因此,不要使用using (var stream = 鈥�)块。Web API 将为您处理流。

  • 确保流的当前位置设置为 0(即流数据的开头)。在上面的示例中,这是给定的,因为您刚刚打开了文件。但是,在其他情况下(例如当您第一次将一些二进制数据写入 a 时) ,MemoryStream请确保stream.Seek(0, SeekOrigin.Begin);``stream.Position = 0;

  • 对于文件流,明确指定FileAccess.Read权限有助于防止 Web 服务器上的访问权限问题;IIS 应用程序池帐户通常只被授予对 wwwroot 的读取/列出/执行访问权限。

解决方法

我正在使用 ASP.NET MVC 的新 WebAPI 开发 Web 服务,它将提供二进制文件,主要是.cab文件.exe

以下控制器方法似乎有效,这意味着它返回一个文件,但它将内容类型设置为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"));
}

有一个更好的方法吗?