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

XuDong Peng-MSFT 10,176 信誉分 Microsoft 供应商
2024-01-29T09:12:21.2833333+00:00

我正在使用 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"));
}

有没有更好的方法?

ASP.NET API
ASP.NET API
ASP.NET: .NET Framework 中一套用于生成 Web 应用程序和 XML Web 服务的技术。API: 支持两个应用程序相互交互的软件中介。
7 个问题
0 个注释 无注释
{count} 票

接受的答案
  1. Zhi Lv - MSFT 32,021 信誉分 Microsoft 供应商
    2024-01-29T09:23:00.8466667+00:00

    你好,

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

    代码示例:

    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 在处理控制器方法的结果以将数据发送回客户端时仍然需要能够访问它。 因此,不要使用 using (var stream = …)块。 Web API 将为您处理流。
    • 确保流的当前位置设置为 0(即流数据的开头)。 在上面的示例中,这是给定的,因为您刚刚打开了该文件。 但是,在其他场景中(例如当您第一次将一些二进制数据写入MemoryStream时),请确保stream.Seek(0, SeekOrigin.Begin); 或设置 stream.Position = 0;
    • 对于文件流,显式指定“FileAccess.Read”权限可以帮助防止 Web 服务器上的访问权限问题; IIS 应用程序池帐户通常仅被授予对 wwwroot 的读取/列出/执行访问权限。

    如果答案是正确的解决方案,请单击“接受答案”并请投赞成票。如果您对此答案有其他疑问,请点击“评论”。
    注意:如果您想接收此线程的相关电子邮件通知,请按照我们文档中的步骤启用电子邮件通知。
    最好的问候

    0 个注释 无注释

0 个其他答案

排序依据: 非常有帮助