Asp.net web api 如何访问SetDefaultContentHeaders中的基础对象?

Asp.net web api 如何访问SetDefaultContentHeaders中的基础对象?,asp.net-web-api,Asp.net Web Api,我有一个web api,返回一个对象。当我使用accept头“image/jpg”时,我需要该对象的图像表示,但我希望根据返回的对象设置文件名。我已经实现了一个BufferedMediaTypeFormatter,并认为应该在方法SetDefaultContentHeaders中实现它,如下所示: public override void SetDefaultContentHeaders(Type type, HttpContentHeaders headers, MediaTypeHeader

我有一个web api,返回一个对象。当我使用accept头“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
中时,如何获取底层对象?在beta版中,我可以通过从传递给该方法的
HttpResponseMessage
中读取它,但该消息已被删除。

在那里无法获取对象实例

格式化程序中唯一可以访问对象的地方是
WriteToStreamAsync
,此时您无法再修改头,因为它们已经发送了

您有两个选项,要么将文件名保存在控制器中的
请求.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);
        }
另一种方法是在管道末端使用委派处理程序: 即(当然,当您想要反序列化时,您已经过滤掉了,依此类推):

公共类重命名句柄:DelegatingHandler
{
受保护的重写System.Threading.Tasks.Task SendAsync(HttpRequestMessage请求,System.Threading.CancellationToken CancellationToken)
{
返回base.SendAsync(请求,取消令牌).ContinueWith(t=>
{
var msg=t.结果;
var myobj=msg.Content.ReadAsAsync().Result;
msg.Content.Headers.ContentDisposition.FileName=myobj.Name+“.mobi”;
返回味精;
});
}
}

确保从GetPerRequestFormatterInstance返回新实例,否则会出现线程问题(所有请求都将使用单个默认实例)。
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;
            });
        }
    }