如何使用自定义消息返回文件

Posted

技术标签:

【中文标题】如何使用自定义消息返回文件【英文标题】:How to return File with custom Message 【发布时间】:2021-08-20 16:00:42 【问题描述】:

我使用 HttpResponseMessage 将文件返回到前端:

public HttpResponseMessage Post(string version, string environment,
string filetype)

    var path = @"C:\Temp\a.txt";
    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;

问题是我怎样才能将消息与文件一起返回?我认为如果将消息添加到自定义标头,它会受到限制。

编辑:

这里的用例是该动作将创建很多文件,压缩文件并将压缩文件返回到前端,但问题是某些文件没有成功创建我需要返回文件为前端命名,我可以在数据库中创建日志,但问题是前端不知道日志 ID 或其他一些信息来识别特定日志。

【问题讨论】:

【参考方案1】:

简单的答案是:你不能。

Content-Type: application/octet-stream 设置内容类型,因此浏览器将假定作为内容一部分的字节是二进制文件。

这里的用例是什么? 也许您可以使用 Multipart,就像用于电子邮件一样,但通常只有单独的请求/端点是典型的解决方案。您甚至可以将查询参数(例如 ?message)附加到现有端点

【讨论】:

是的,但是当使用 json 时,它不再是简单的文件下载,它还需要编码和解码,然后作为从本地存储/blob 中下载。所有这些都应该是多条路线。当然,可以实现不同的操作,但有很多下游问题,例如自定义消息将不再被代理缓存,这对文件下载等有意义 这里的用例是这个动作会创建很多文件,压缩文件并将压缩文件返回到前端,但问题是一些文件没有成功创建我需要将文件名返回到前端,我可以在数据库中创建日志,但问题是前端不知道日志 ID 或其他一些信息来识别特定日志。 那么我会使用一些“准备”路线,开始压缩并可能返回文件列表,成功的或错误的,然后可以使用重定向和/或返回一些临时的文件 id(你应该为它们使用 UUID 或其他东西,并在一段时间后真正删除它们)。生成的文件 ID 然后是第二个路由/调用,即下载 zip 的那个。关于压缩失败的信息不是文件的一部分,而是请求/创建它的过程 是的,不同的要求是一种选择。我会知道在日志文件路径中添加自定义响应标头是个好主意吗?那么我可以将错误记录到日志文件中吗?这个想法是如果前端没有得到请求头,它就不会发送发送请求来获取错误 并非如此,因为日志文件不应该被整个网络访问,因此您根本不需要将错误存储在日志文件中,而是可以直接将它们发送回前端并用不同的请求在服务器上忘记它。然后前端甚至可以以不同的方式处理:关键文件丢失 - 开始下载?再试一次?

以上是关于如何使用自定义消息返回文件的主要内容,如果未能解决你的问题,请参考以下文章

如何从控制器方法验证返回自定义错误消息

如何返回自定义 503 消息?

如何在 dotnet core Web Api 中返回自定义错误消息

如何在 .Net Core 中返回错误状态代码 401 的自定义错误消息?

如何在自定义 AuthenticationFailureHandler 中返回由具体派生 AuthenticationException 类型解析的不同错误消息

如何在 Web API Post 方法中返回自定义消息