问题描述
尝试使用一个简单HttpResponseMessage
的Content
属性设置为 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"));
}
有一个更好的方法吗?