我有一个MediaTypeFormatter
将图像的内部代表转换为 png/jpeg/等。如果有人要求。但是,WriteToStreamAsync
除非我添加 image/png 或类似于接受标头,否则我永远不会被调用。
首先,这是我的 webapi 方法,为简洁起见,删除了一些关键位:
public ImageFormatter.BinaryImage GetImage(int cId, int iId)
{
....
using (var input = iFIO.OpenRead())
{
input.Read(b.data, 0, (int)iFIO.Length);
}
// With this next line my mediatypeformatter is correctly called.
Request.Headers.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("image/png"));
return b;
}
这是我的写部分MediaTypeFormatter
(还有一个读部分,实际上效果很好)。
namespace PivotWebsite.MediaFormatters
{
public class ImageFormatter : MediaTypeFormatter
{
public class BinaryImage
{
public byte[] data;
public string metaData;
}
public ImageFormatter()
{
SupportedMediaTypes.Add(new MediaTypeHeaderValue("image/jpg"));
SupportedMediaTypes.Add(new MediaTypeHeaderValue("image/jpeg"));
SupportedMediaTypes.Add(new MediaTypeHeaderValue("image/png"));
}
public override bool CanWriteType(Type type)
{
return true;
}
public override async Task WriteToStreamAsync(Type type, object value, Stream writeStream, HttpContent content, TransportContext transportContext)
{
var b = value as BinaryImage;
if (b == null)
throw new InvalidOperationException("Can only work with BinaryImage types!");
await writeStream.WriteAsync(b.data, 0, b.data.Length);
}
}
}
我希望能够做的是,在WriteToStreamAsync
中更改传出标题以将 Content-Type 包含为“image/png”(或其他任何内容,具体取决于数据类型)。
但是,当我从带有“ http://my.testdomain.net:57441/api/Images?cID=1&iID=1
”之类的 URL 的 Web 浏览器调用它时,WriteToStreamAsync
永远不会调用它(接受的标头列为 {text/html, application/xhtml+xml, */*})。如果我在上面添加添加正确图像类型的行,那么一切都会按我的预期调用。
我在这里想念什么?接受的“*/*”标头应该触发了我的媒体格式化程序,对吧?或者...我是否缺少有关 Web API 管道的基本知识。