2つのパラメーター(サイズ変更のためのxとy)を持つ画像を返す最良の方法は何ですか。
例えば
~/api/image12345/200/200
200 x 200のjpg/png/gifを返します
System.Drawing.Image
オブジェクトを返すか、HTTPReponseMessage.Content
を手動で定義する必要がありますか?
System.Drawing.Image
を返すべきではありません。ただし、適切なバイトに変換する方法を知っているフォーマッターを追加しても、期待どおりにイメージバイトとしてシリアル化されません。
考えられる解決策の1つは、コンテンツに保存されている画像と共にHttpResponseMessage
を返すことです(以下に示すように)。質問で示したURLが必要な場合は、{imageName}、{width}、および{height}パラメーターをマップするルートが必要になることに注意してください。
public HttpResponseMessage Get(string imageName, int width, int height)
{
Image img = GetImage(imageName, width, height);
using(MemoryStream ms = new MemoryStream())
{
img.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
result.Content = new ByteArrayContent(ms.ToArray());
result.Content.Headers.ContentType = new MediaTypeHeaderValue("image/png");
return result;
}
}
しかし、繰り返しますが、多くの場所でこれを行っている場合、フォーマッタルートを使用することが「推奨」方法である可能性があります。プログラミングのほとんどすべてとして、答えはシナリオによって異なります。
画像は重いです。 ASP.NET WebForms、HttpHandlers、MVC、およびWeb APIはすべて、静的ファイルを提供するという絶対的なterribleジョブを実行します。 IISはextremelyを実行します-多くの場合20〜100倍効率的です。
良好なパフォーマンスを得るには、PostAuthorizeRequestの実行中にURL書き換え最新を実行します。これにより、IISがファイルを取得して提供できます。はい、これはHttpModuleレベルのイベント処理を意味します。
[免責事項:私は次の記事とオープンソースプロジェクトの著者です]
画像を動的に処理する場合は、 回避する画像処理の落とし穴に関するこの記事を参照 を確認し、 ImageResizer を検討することを検討してください。優れたディスクキャッシング(IIS静的ファイル処理を使用)を備えており、あらゆる種類の画像生成に簡単に接続できます。高度な機能が必要な場合は、AForge、FreeImage、およびWICのオプションのバインディングもあります。