我有一个 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(使用前将#替换为@)