【问题标题】:How to additionally include File as response of WebAPI如何另外包含文件作为 WebAPI 的响应
【发布时间】:2017-11-13 13:49:21
【问题描述】:

我当前的 Web API 已经响应如下 JSON 数据。

public HttpResponseMessage GetFieldInfo()
        {
  //....  
return Ok(GetFieldsInstance());  //GetFieldsInstance returning with DTO class instance.
}

现在,我需要在 JSON 响应中包含文件。我找不到任何显示如何在单个响应中包含文件流和 JSON 的链接。

对于文件流,它将按以下方式工作,但无法找到方法,如何将 JSON 对象属性包含在文件流中。

result = Request.CreateResponse(HttpStatusCode.OK);
                result.Content = new StreamContent(new FileStream(localFilePath, FileMode.Open, FileAccess.Read));
                result.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment");
                result.Content.Headers.ContentDisposition.FileName = "FieldFile";

【问题讨论】:

  • 您的操作应返回一种内容类型。 JSON 或文件。您可以做什么创建另一个操作,该操作将返回文件流,然后在您的 JSON 响应中包含指向该文件的链接以及其他属性。
  • 因此,创建其他仅返回文件的操作本身。并且该控制器/动作的 URL 包括作为 JSON 响应(主要动作)的属性。是吗?
  • 是的,这就是我的建议。
  • 在这种情况下,它将是单独的操作 URL,它也会被发布。不确定,一个额外的 URL 将允许从企业发布。
  • 您需要序列化(最有可能是base64)文件并将其作为属性添加到json,以便客户端反序列化。如果文件很大,这可能会导致其自身的问题。

标签: c# json asp.net-web-api asp.net-web-api2 filestream


【解决方案1】:

您可以将文件转换(序列化)为 base64 字符串,并将其作为属性包含在 JSON 响应中。

public IHttpActionResult GetFieldInfo() {
    //...

    var model = new { 
        //assuming: byte[] GetBinaryFile(...)
        data = Convert.ToBase64String(GetBinaryFile(localFilePath)), 
        result = "final",
        //...other properties...
    };

    return Ok(model);
}

然后,客户端需要将 base64 字符串转换(反序列化)回您想要使用的文件。

请注意,根据文件的大小,它可能会大大增加响应的大小,客户端应考虑到这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-14
    • 1970-01-01
    • 1970-01-01
    • 2017-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多