MediaTypeFormatter
画像の内部表現をpng/jpeg/etcに変換するがあります。誰かがそれを求めた場合。ただし、WriteToStreamAsync
image / pngまたはacceptヘッダーに類似したものを追加しない限り、呼び出されることはありません。
まず、簡潔にするためにいくつかの重要なビットを削除した、私の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、* / *}としてリストされます)。適切な画像タイプを追加する上記の行を追加すると、すべてが期待どおりに呼び出されます。
ここで何が欠けていますか?「*/*」の受け入れられたヘッダーは、私のメディアフォーマッターをトリガーするはずでしたね?または...WebAPIの配管に関する基本的なことを見逃していますか?