gpt4 book ai didi

asp.net-web-api - 如何访问 SetDefaultContentHeaders 中的底层对象?

转载 作者:行者123 更新时间:2023-12-01 10:04:07 25 4
gpt4 key购买 nike

我有一个网络 API,我可以在其中返回一个对象。当我使用接受 header “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,到那时您不能再修改 header ,因为它们已经发送。

您有两个选择,要么将文件名保存在 Controller 的 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);
}

另一种是在管道末端使用委托(delegate)处理程序:IE。 (当然你要反序列化的时候有filter out等等):

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;
});
}
}

关于asp.net-web-api - 如何访问 SetDefaultContentHeaders 中的底层对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12563571/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com