web-dev-qa-db-ja.com

ASP.NET Web APIを使用して画像を返す推奨方法はありますか

2つのパラメーター(サイズ変更のためのxとy)を持つ画像を返す最良の方法は何ですか。

例えば

~/api/image12345/200/200

200 x 200のjpg/png/gifを返します

System.Drawing.Imageオブジェクトを返すか、HTTPReponseMessage.Contentを手動で定義する必要がありますか?

80
Max Alexander

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

しかし、繰り返しますが、多くの場所でこれを行っている場合、フォーマッタルートを使用することが「推奨」方法である可能性があります。プログラミングのほとんどすべてとして、答えはシナリオによって異なります。

136
carlosfigueira

画像は重いです。 ASP.NET WebForms、HttpHandlers、MVC、およびWeb APIはすべて、静的ファイルを提供するという絶対的なterribleジョブを実行します。 IISはextremelyを実行します-多くの場合20〜100倍効率的です。

良好なパフォーマンスを得るには、PostAuthorizeRequestの実行中にURL書き換え最新を実行します。これにより、IISがファイルを取得して提供できます。はい、これはHttpModuleレベルのイベント処理を意味します。

[免責事項:私は次の記事とオープンソースプロジェクトの著者です]

画像を動的に処理する場合は、 回避する画像処理の落とし穴に関するこの記事を参照 を確認し、 ImageResizer を検討することを検討してください。優れたディスクキャッシング(IIS静的ファイル処理を使用)を備えており、あらゆる種類の画像生成に簡単に接続できます。高度な機能が必要な場合は、AForge、FreeImage、およびWICのオプションのバインディングもあります。

19
Lilith River