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

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

下面的控制器方法似乎有效,这意味着它返回一个文件,但它将内容类型设置为application/json

公共HttpResponseMessage<溪流>Post(字符串版本、字符串环境、字符串文件类型)
{
var [email protected]“C:\Temp\test.exe”;
var stream=新文件流(路径,FileMode.Open);
返回新的HttpResponseMessage<Stream>(Stream,新的MediaTypeHeaderValue(“应用程序/八位字节流”);
}

有更好的方法吗

尝试使用简单的HttpResponseMessage,将其Content属性设置为StreamContent

//使用System.IO;
//使用System.Net.Http;
//使用System.Net.Http.Header;
公共HttpResponseMessage Post(字符串版本、字符串环境、,
字符串(文件类型)
{
var [email protected]“C:\Temp\test.exe”;
HttpResponseMessage结果=新的HttpResponseMessage(HttpStatusCode.OK);
var stream=newfilestream(路径,FileMode.Open,FileAccess.Read);
结果.内容=新的流内容(流);
result.Content.Headers.ContentType=
新的MediaTypeHeaderValue(“应用程序/八位字节流”);
返回结果;
}

关于所使用的需要注意的几点:

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

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

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

发表评论