Web Api - 如何检测响应何时完成发送

2024-03-15

在 Web api 方法中,我生成一个文件,然后将其流式传输到响应,如下所示

public async Task<HttpResponseMessage> GetFile() {
    FileInfo file = generateFile();
    var msg = Request.CreateResponse(HttpStatusCode.OK);

    msg.Content = new StreamContent(file.OpenRead());
    msg.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");
    msg.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") {FileName = file.Name};

    return msg;
}

因为这是一个生成的文件,我想在响应完成流式传输后将其删除,但我似乎无法在管道中找到此钩子。

我想我可以将文件的引用放在静态中,并设置一个自定义 MessageHandler,从同一个静态变量中提取值并删除。然而,这似乎不可能是正确的,因为使用了静态(当这一切都应该是每个请求时)并且因为我必须注册一个单独的路由。

我见过这个问题 https://stackoverflow.com/questions/16359485/how-to-know-when-a-response-has-finished-being-sent-to-the-client但似乎并没有真正有太多有用的回应。


不错的场景!...使用消息处理程序的问题是响应写入发生在主机层和消息处理程序层下方,因此它们并不理想...

以下是如何执行此操作的示例:

msg.Content = new CustomStreamContent(generatedFilePath);

public class CustomStreamContent : StreamContent
{
    string filePath;

    public CustomStreamContent(string filePath)
        : this(File.OpenRead(filePath))
    {
        this.filePath = filePath;
    }

    private CustomStreamContent(Stream fileStream)
        : base(content: fileStream)
    {
    }

    protected override void Dispose(bool disposing)
    {
        //close the file stream
        base.Dispose(disposing);

        try
        {
            File.Delete(this.filePath);
        }
        catch (Exception ex)
        {
            //log this exception somewhere so that you know something bad happened
        }
    }
}

顺便说一句,您生成此文件是因为您要将一些数据转换为 PDF。如果是,那么我想你可以使用PushStreamContent为此,通过将转换后的数据直接写入响应流。这样您就不必先生成文件,然后再担心删除它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Web Api - 如何检测响应何时完成发送 的相关文章

  • 确保奥尔良管道执行中的消息顺序

    我有三种谷物 A B 和 C 在管道中执行不同的工作 GrainA会将结果传递给grainB grainB会将结果传递给grainC 我想保证连续的grain之间的顺序消息发送 这可以通过下面的方法来实现 client code forea
  • pubxml Web 发布工具事件生命周期

    我正在使用 Visual Studio 2012 中的 Web 发布工具发布到文件系统 我了解到我可以打开 Properties 文件夹中的 pubxml 来执行更高级的操作 我想要做的是在发布任务结束时运行命令行应用程序 我通常会在自定义
  • 如何从代码中隐藏 div (c#)

    我的页面上有一个 div 元素 我希望根据代码隐藏中的会话值显示 隐藏该元素 我怎样才能做到这一点 给div runat server and an id你可以在你的code behind div 在后面的代码中 theDiv Visibl
  • ASP.NET 网站“发布”与 Web 部署项目

    如果我决定对 ASP NET 网站使用 发布 选项 而不是 Web 部署项目 我可以执行自定义 msbuild 操作吗 或者 如果我想在编译 部署期间执行自定义 msbuild 操作 我是否需要坚持使用 WDP 我认为发布选项是 VS NE
  • 如何获取 Visual Studio 的“发布”功能以包含生成后事件中的文件?

    我目前正在尝试使用 Visual Studio 2010 发布 和 MSDeploy 功能来处理我的 Web 部署需求 但在根据我的构建配置自定义包方面遇到了障碍 我在 32 位环境中开发 但需要为 64 位环境创建发布包 因此在 发布 配
  • 如何在网页中显示嵌入的 Excel 文件?

    我想允许在网页中查看嵌入的 Excel 报告 有什么办法吗 我不想使用 ActiveX 或 OWC Office Web 组件 我只想从 Internet Explorer 应用程序打开现有文件 我不希望用户下载然后打开它 使用 ifram
  • “更新/取消”按钮不会出现在模板字段编辑按钮中

    当您使用 Gridview 的每一行创建编辑按钮时CommandField单击后它会显示更新 取消按钮 以便您可以接受 取消更改 但是 我想要一个带有工具提示文本的编辑按钮 因为CommandField没有工具提示属性 我用过Templat
  • “通用”电话号码的基本正则表达式

    我需要一个正则表达式 用于 ASP NET 网站 来验证电话号码 它应该是灵活的 唯一的限制是 应至少为 9 位数字 没有字母 可以包含空格 连字符 单个 我搜索过 SO 和 Regexlib com 但我得到的表达式有更多限制 例如英国电
  • 将 WebResponse 保存为 txt

    我正在寻找一种与 WebResponse 中的 Request SaveAs 等效的方法 但我找不到它 我想将网络响应的标题和正文存储在 txt 文件中 你知道有什么技术可以实现它吗 没有内置的方法 但您可以简单地使用获取响应流 http
  • 无法使用 dataformatstring 格式化日期时间

    由于某种原因 我无法在网格视图中格式化日期文本
  • 了解 ASP.NET 应用程序文件夹

    ASP NET 中的应用程序文件夹用于存储对运行网站至关重要的各种元素 我想更深入地了解这些文件夹 特别是文件夹的可访问性 根据有关的文章ASP NET 网站布局 http msdn microsoft com en us library
  • ASP.Net 控件的 InnerHTML 和 InnerText 属性之间的区别?

    例如 在使用 ASP NET 控件时 h1 text h1 如果我们想更改标题的文本 我们可以通过两个属性来完成InnerHTML and InnerText 我想知道这两个属性之间的基本区别是什么 InnerHtml让您直接输入 HTML
  • 使用 SendMessage 通过电子邮件发送文件附件而不保存文件

    我可以发送电子邮件和所有内容 但无法创建有效的 Attachment 放入我的电子邮件中 我在网上找到的所有示例都假设它以某种方式保存在我的计算机本地并通过路径链接它 但事实并非如此 在我的方法中 我使用 Winnovative 创建文件
  • jquery ajax可以调用外部webservice吗?

    jquery ajax代码可以调用吗网络服务来自另一个域名或另一个网站 像这样 ajax type POST url http AnotherWebSite com WebService asmx HelloWorld data name
  • 错误:“无法在 Web 服务器上开始调试...”ASP.NET 4.0

    当我想在 IIS 服务器上创建网站时出现错误 我使用的是 Windows 7 和 Visual Studio 2010 我是否必须为 IIS 注册或配置 asp net 4 0 这里没有太多细节 但是当我尝试在刚刚从 3 5 更改为 4 0
  • 如何根据 ASP.NET VNEXT MVC6 中给出的路径进行虚拟路由/重定向?

    我有一个网站 它在不同的路径上公开多个 API 每个 API 由特定于应用程序部分的控制器处理 例如example com Api Controller Action param1 stuff 其中控制器发生变化 但操作保持相当一致 我有几
  • 本地主机上的 .net HTTP_X_FORWARDED_FOR NULL

    抱歉 如果其他地方已经回答了这个问题 我找不到它 如果没有 我会尝试查找访问过该站点的机器的原始 IP 根据我的基本理解 变量HTTP X FORWARDED FOR无论代理和其他过滤器如何 都会显示用户的 IP 如果这是真的 我正在尝试对
  • 当用户告诉浏览器“刷新”时,是否应该填写 HTTP_REFERER?

    我正在尝试使用引用标头检查作为深度防御 即多种安全技术之一 但请注意仅依赖于任何一种技术 有时 MSIE 似乎不包含刷新时的引荐来源网址 这是预期的行为吗 无论如何 我是否可以检测刷新 以便我知道缺少引荐来源网址是可以的 是的 我知道引荐来
  • 同一服务器上的多个.NET版本

    所以我一直都知道在一台计算机 客户端或服务器 上运行多个版本的 NET 框架是可以的 这个问题 https stackoverflow com questions 407306 running many versions of net on
  • 但说真的...... ASP.NET WebAPI 实现示例(包括 OAuth)

    我真的对 WCF 示例不感兴趣 我发现的 DotNetOpenAuth 实现也是不完整的 https github com DavidChristiansen DotNetOpenAuth WebAPI 40 or 假设WCF https

随机推荐

  • 为什么 Vue.js Chrome Devtools 没有检测到 Vue.js?

    我有一个简单的工作 Vue js 应用程序的以下代码 但 Vue js 开发工具没有响应 前几天还好好的 现在就不行了 可能是哪里出了问题 当我去webstore https chrome google com webstore detai
  • 使用 edmx 文件时如何指定连接字符串中的元数据位置

    我有一个 Web 项目 其数据模型在 edmx 文件中定义 连接字符串的开头如下 元数据 res 这一段时间以来效果很好 但是参与该项目的其他人创建了一个也使用实体框架的 dll 并将其添加到 bin 文件夹中 现在 当我尝试创建连接时 加
  • 为什么我不能使用具有存在量化类型的记录选择器?

    当使用存在类型时 我们必须使用模式匹配语法来提取forall编辑值 我们不能将普通的记录选择器用作函数 GHC 报告错误并建议使用与此定义的模式匹配yALL LANGUAGE ExistentialQuantification data A
  • 当参数有空格时,如何从 powershell 调用 msdeploy?

    我在尝试从 powershell 脚本发送到 msdeploy 的参数中遇到了空格问题 还有许多其他相关文章 但都没有解决问题 使用 Power Shell 和 MSDeploy 时遇到的问题 http forums iis net p 1
  • 无法加载文件或程序集“Microsoft.Office.Interop.Excel,版本=14.0.0.0”

    我有一个使用 MS Excel 文件读 写的网站 我将相关的 dll 添加到网站的 Bin 文件夹中 它在我的本地主机上运行得很好 我想是因为我在我的电脑上安装了 MS Excel 2010 但是当我将其上传到远程电脑并运行该网站时 它会抛
  • 设计模式 - Objective-C - MVC 模型视图控制器

    您好 我已经阅读了网上有关 MVC 的教程 并且已经阅读了此处的主题 我想我已经了解了 MVC 的概念 但我不确定它的实现 我尝试将其应用于一个简单的程序 一个带有标签和按钮的窗口 该按钮增加一个计数器 标签显示它的值 我尝试了两种不同的方
  • 如何运行命名空间内的 JavaScript 函数

    如果我有类似的东西 App editingMode function function setEditingMode entityID editingMode val 1 ajax type POST url Organisations M
  • 如何控制CVS存储库中的文件权限?

    目前 一些用户的 umask 设置方式导致对常规文件的执行权限 我想避免 有没有办法强制所有签入的文件只能被读取 但有一些例外 在 CVS 中处理此问题的推荐方法是什么 Cvs 命令选项 watch 也会阻止恢复文件权限 如果观看 则检出文
  • 使用不带标签的 Git 描述

    我有一个存储库 当我运行时它只给我一个哈希值git describe 直到今天我才知道它这样做是因为 always选项 这就是我正在使用的 因为该存储库没有标签 我有另一个包含很多标签的存储库 我该如何使用git describe排除标签并
  • Mysql 选择不在表中的位置

    我有 2 个表 A 和 B 具有相同的主键 我想选择 A 中而不是 B 中的所有行 以下方法有效 select from A where not exists select from B where A pk B pk 但看起来很糟糕 A
  • Oracle Select IN 参数中的多个字段

    Select FROM STUDENT WHERE student course student major IN SELECT schedule course schedule major FROM schedule 如果我必须提供静态值
  • defaultCalendarForNewEvents 失败

    当我尝试调用 newEventStore defaultCalendarForNewEvents 时 它返回一条错误消息 707 907 defaultCalendarForNewEvents failed Error Domain EKC
  • 实现具有多重继承的纯虚函数

    假设有这样一个接口 class A public virtual foo 0 还有一个班B它实现了这个接口 class B public A public virtual foo Foo implemented by B 终于有一节课了C有
  • 根据选定的<选项>动态更新表单操作

    所以 这就是我想要做的 我想要一个 HTML 格式的下拉列表 其中包含一个根据下拉列表的值而变化的提交按钮 所以 当我有这个时
  • MediaWiki 类别不会自动更新

    我有一个MediaWiki在 Linux 服务器上运行的实例似乎不会在提交页面编辑时自动更新其类别 我从未在我使用过的任何其他维基上看到过这一点 所以我想知道是否有一些脚本配置不正确 定期运行rebuildAll php or refres
  • 如何将 XAML 转换注入到我的构建中?

    我想针对我的 XAML 资源字典运行自定义 EXE 假设我得到的这个 exe 将删除注释 空格和未使用的资源 原始 XAML 文件需要保持不变 但最终出现在 XAP 和 DLL 中的 XAML silverlight 和 BAML wpf
  • 使用 Detected Idiom 实现 is_destructible

    这是我的实现is destructible v https en cppreference com w cpp types is destructible template
  • Javascript 警报在页面显示之前加载

    在我的手机上 在 Safari 中如果我转到默认页面alert Hello 在正文 onload 事件中 警报显示 我的默认页面在后台完全可见 如果我随后转到另一个网站 例如 bbc co uk 然后在地址栏中输入默认页面的网址 则警报会在
  • 为什么 Docker Django 管理员崩溃并显示代码 245

    我正在 OSX 10 15 3 上使用 runserver 运行 Django 版本 3 0 3 使用我的应用程序没有问题 但是当我尝试访问时http localhost 8000 admin http localhost 8000 adm
  • Web Api - 如何检测响应何时完成发送

    在 Web api 方法中 我生成一个文件 然后将其流式传输到响应 如下所示 public async Task