3

我有一个 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;
}

所以问题是当我在时如何获取底层对象SetDefaultContentHeadersHttpResponseMessage我可以通过从传递给方法的方法中读取它来在测试版中做到这一点,但它已被删除。

4

1 回答 1

7

您无法在此处获取对象实例。

格式化程序中唯一可以访问对象的位置是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);
        }

另一种是在管道末端使用委托处理程序:即(当然,当您想要反序列化时,您已经过滤掉等等):

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;
            });
        }
    }
于 2012-09-24T12:58:22.160 回答