try 使用简单的HttpResponseMessage
,并将其Content
属性设置为StreamContent
:
// 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
个,需要注意以下几点:
您不能调用stream.Dispose()
,因为Web API在处理控制器方法的result
以将数据发送回客户端时仍然需要能够访问它.因此,不要使用using (var stream = …)
号挡路.Web API将为您处置流.
确保流的当前位置设置为0(即流数据的开头).在上面的示例中,这是给定的,因为您刚刚打开了文件.但是,在其他情况下(例如,当您第一次向MemoryStream
写入一些二进制数据时),请确保将其设置为stream.Seek(0, SeekOrigin.Begin);
或stream.Position = 0;
对于文件流,明确指定FileAccess.Read
权限有助于防止web服务器上的访问权限问题;IIS应用程序池帐户通常只被授予对wwwroot的读取/列出/执行访问权限.