我正在使用ASP开发一个web服务.NET MVC的新WebAPI将提供二进制文件,主要是.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"));
}

有没有更好的方法来做这件事?

推荐答案

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的读取/列出/执行访问权限.

Asp.net相关问答推荐

ASP.NET Core 延迟加载始终返回 null

在 AppConfig.json 中存储对象的最佳方式

逐步 ASP.NET 自动构建/部署

Web 服务器配置为不列出此目录的内容. asp.net vs 2012 错误?

如何在 ASP.NET 中设置自动实现属性的默认值

asp.net dropdownlist - 在 db 值之前添加空行

IIS 将旧用户名返回到我的应用程序

无法读取配置部分system.servicemodel,因为它缺少部分声明

从 RowDataBound 事件的 gridview 从单元格中获取值

你如何确定哪个验证器失败了?

在不知道键名的情况下访问 JSON 对象的元素

如何在新选项卡中打开 asp:HyperLink.NavigateUrl

ASP.NET 中的全局资源与本地资源

您使用哪个 .NET Memcached 客户端,EnyimMemcached 与 BeITMemcached?

错误请求 - 无效的主机名 ASP.net Visual Studio 2015

避免将重复元素添加到列表 C#

在 ASPNET 标识 2.0 中禁用用户

将Bundle 包添加到现有的 ASP.NET Webforms 解决方案

强制 IIS Express 进入classic 管道模式

ASP.NET MVC2/3 中runAllManagedModulesForAllRequests的正确用法是什么?