如何访问SetDefaultContentHeaders中的底层对象?

2024-03-13

我有一个 Web api,我在其中返回一个对象。当我使用接受标头“image/jpg”时,我想要该对象的图像表示形式,但我想根据我返回的对象设置文件名。我已经实施了一个BufferedMediaTypeFormatter并认为我应该在方法中这样做SetDefaultContentHeaders像这样:

public override void SetDefaultContentHeaders(Type type, HttpContentHeaders headers, MediaTypeHeaderValue mediaType)
{
    base.SetDefaultContentHeaders(type, headers, mediaType);
    var myObject = // How do I get this from the response?
    var contentDispositionHeader = new ContentDispositionHeaderValue("attachment") 
        { FileName = myObject.FileName };
    headers.ContentDisposition = contentDispositionHeader;
}

所以问题是当我处于SetDefaultContentHeaders?我可以在测试版中通过阅读它来做到这一点HttpResponseMessage它被传递到该方法中,但已被删除。


您无法在那里获取对象实例。

格式化程序中唯一可以访问该对象的位置是WriteToStreamAsync,到那时您将无法再修改标头,因为它们已经发送了。

您有两个选择,要么将文件名保存在request.Properties在您的控制器中并通过覆盖在格式化程序中检索GetPerRequestFormatterInstance(因为它之前运行SetDefaultContentHeaders)。然后你可以使用这个值SetDefaultContentHeaders

//Controller
public Url Get(int id)
        {
            Request.Properties.Add("name", _repo.Get(id).Name);
            return _repo.Get(id);
}

//Formatter
        public override MediaTypeFormatter GetPerRequestFormatterInstance(Type type, System.Net.Http.HttpRequestMessage request, MediaTypeHeaderValue mediaType)
        {
            //here save the request.Properties["name"] to some local field which you can use later
            return base.GetPerRequestFormatterInstance(type, request, mediaType);
        }

另一种方法是在管道末尾使用委托处理程序: IE。 (当然,当你想反序列化等时你已经过滤掉了):

public class RenameHandler : DelegatingHandler
    {
        protected override System.Threading.Tasks.Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
        {
            return base.SendAsync(request, cancellationToken).ContinueWith<HttpResponseMessage>(t =>
            {
                var msg = t.Result;
                var myobj = msg.Content.ReadAsAsync<IMobi>().Result;
                msg.Content.Headers.ContentDisposition.FileName = myobj.Name + ".mobi";

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

如何访问SetDefaultContentHeaders中的底层对象? 的相关文章

随机推荐

  • Signalr - 无法读取服务器上的查询字符串

    我在这里要疯了 我完成了 chatHub 教程 一切正常 我连接到服务器 我可以向每个客户广播一条消息 然后我尝试添加查询字符串 因为我想获得有关我的用户的一些信息 因为许多用户可以在同一会话中连接 这是我的 JavaScript func
  • 是否可以制作交互式 Rake 任务?

    我想运行一个要求用户输入的 Rake 任务 我知道我可以在命令行上提供输入 但我想询问用户是否sure他们希望继续执行特定操作 以防错误输入提供给 Rake 任务的值之一 像这样的东西可能会起作用 task action do STDOUT
  • 使用 Bash 变量代替文件作为可执行文件的输入

    我有一个可执行文件 其使用方式如下 executable v i inputFile txt o outputFile eps 为了提高效率 我想使用 Bash 变量代替输入文件 所以 我想做如下的事情 executable v i inp
  • jQuery 将 Google Adsense 附加到 div

    我遇到了 google adsense 的问题 它在我的 jQuery 之前加载并杀死了我的代码 所以我想我应该尝试使用文档准备功能将 Google Adsense javascript 附加到适当的 div 这是我尝试的代码写
  • 如何更改 TYPO3 中的页眉布局(添加一些换行 div)

    您好 我需要更改 TYPO3 中的标题布局 下图 我正在使用流体模板系统 我还找到了可以更改它的 html 文件 该文件的原始路径是 typo3 src 7 6 16 typo3 sysext fluid styled content 资源
  • Laravel 5.5 尝试使用 PHP 的 mail() 发送邮件时出错:预期响应代码 250,但得到代码“550”

    我已将站点升级到 Laravel 5 5 突然我无法再发送邮件 因为它给了我以下错误 Production ERROR 预期响应代码 250 但得到代码 550 其中 消息 550 未经过身份验证 请启用 SMTP 身份验证 电子邮件软件和
  • 使用 GCS 客户端库模拟云存储的 GAE java 上的文件 uri 是什么?

    我正在使用 Java 的 Google 应用程序引擎开发一个 Web 应用程序 我将使用 Google Cloud 存储并根据文档 https developers google com appengine docs java google
  • c getline 跳过空行

    while getline line line size f 1 I m using this function to read line line But i want to know when i m reading a blank l
  • c char 指针问题

    如果我们声明char p hello 那么由于它被写入数据部分 我们无法修改p指向的内容 但我们可以修改指针本身 但我在 C Traps and Pitfalls 中找到了这个例子 安德鲁 科尼格 AT T贝尔实验室 默里山 新泽西州 07
  • 获取 Instagram 上用户的性别

    我只是想知道是否有办法在 Instagram 上获取用户的性别 我浏览了 Instagram 的 api 从 users userId 获取的用户信息不包含性别信息 感谢您的帮助 NO 目前还没有办法从API获取instagram用户的性别
  • UTF-8 文本(印地语)未显示在浏览器窗口或 Eclipse 控制台上

    我必须在浏览器屏幕上显示印地语 或任何区域语言 的文本 我将从数据库中获取此文本 为此 我从以下几个方面开始 String escapedStr u0905 u092d u0940 u0938 u092e u092f u0939 u0948
  • 在Python中找到分数列表的最小公分母

    我有一个分数列表 from fractions import Fraction fractions list Fraction 3 14 Fraction 1 7 Fraction 9 14 输出应该是一个列表 其中包含每个分数的分子 最后
  • React - 将所有数据从 json 加载到组件中

    我正在使用 React 并尝试将数据从本地 json 文件加载到我的组件中 我试图打印所有信息 包括名称 值对中的 名称 不仅仅是值 使其看起来像一个表单 我正在寻找最好的方法来做到这一点 我需要解析吗 我需要使用地图功能吗 我是 Reac
  • 在 PHP 中获取数组的最后一个元素而不更改数组? [复制]

    这个问题在这里已经有答案了 array pop 将其从数组中删除 end 改变内部指针 唯一的方法真的像这样 my array array pop array keys my array 这有效 list end array slice a
  • 如何检查 window.external 上是否存在函数

    如何检查 window external 上是否存在函数 我正在从 javascript 调用 C 代码 并且想检查 C 对象中是否存在方法 我找到了路 只需使用 in 运算符 如下所示 if FunctionName in window
  • 元组的串联

    普通文本 我在 python 3 2 1 上编码时遇到一些问题 实际上我正在参加有关 python 2 5 的在线讲座 这是代码 x 100 divisors for i in range 1 x if x i 0 divisors div
  • 在 bash shell 中打印星号(“*”)

    a 5 echo aMin bash etc init d ckDskCheck sh 当我尝试运行以下代码时 它会正确显示 5 bash etc init d ckDskCheck sh 但是 当我尝试使用以下代码将结果分配给变量并将其打
  • 快速使用未解析的标识符“UIApplicationStateInactive”

    在我处理推送通知的 Swift 代码中 我有这一行 if application applicationState UIApplicationStateInactive application applicationState UIAppl
  • 如何在sqlite android中插入多行

    我有一种方法可以将值插入到sqlite在一个班级里 在主要活动中 我正在解析 json 值并尝试将这些值插入到sqlite在循环中 因为我必须插入不止一行 但只有一行被添加到数据库中 添加多行的方法如下 public void addSes
  • 如何访问SetDefaultContentHeaders中的底层对象?

    我有一个 Web api 我在其中返回一个对象 当我使用接受标头 image jpg 时 我想要该对象的图像表示形式 但我想根据我返回的对象设置文件名 我已经实施了一个BufferedMediaTypeFormatter并认为我应该在方法中