Asp.net web api 如何访问SetDefaultContentHeaders中的基础对象?
我有一个web api,返回一个对象。当我使用accept头“image/jpg”时,我需要该对象的图像表示,但我希望根据返回的对象设置文件名。我已经实现了一个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
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;
});
}
}