我有一个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;
}
Run Code Online (Sandbox Code Playgroud)
所以问题是当我进入时,我如何获得底层对象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);
}
Run Code Online (Sandbox Code Playgroud)
另一种方法是在管道的末尾使用委托处理程序:即(当然,当你想要反序列化时,你已经过滤掉了等等):
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;
});
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
761 次 |
| 最近记录: |