ASP.NET WebAPIを使用して画像を返すための推奨される方法はありますか


86

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

例えば

~/api/image12345/200/200

200 x 200 jpg / png /またはgifを返します

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


ここで私の答えをチェックしてください: stackoverflow.com/a/20888749/64334
Ronnie Overby 2014年

回答:


147

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

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


画像も使用する必要がありますか?
dibs487 2017年

GetImage方法はどこですか?
ヨーダ

1
@Yodaこれは、クライアントに転送する必要のある画像を返す実装のメソッドです。
carlosfigueira 2018

あなたは、ハードドライブからファイルを返却する場合、私は(この問題の受け入れ答えを参照)、このようなのFileStreamを使用するより良いパフォーマンスだと思う:stackoverflow.com/questions/11125535/...
ジョン・ギルマー

19

画像が重いです。ASP.NET WebForms、HttpHandlers、MVC、およびWeb APIはすべて、静的ファイルを提供するという非常にひどい仕事をします。IISは、その点で非常に優れた仕事をします。多くの場合、20〜100倍効率的です。

良好なパフォーマンスを実現したい場合は、遅くともPostAuthorizeRequest中にURLを書き換えて、 IISがファイルを取得して提供できるようにします。はい、これはHttpModuleレベルのイベント処理を意味します。

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

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


2
私は自分のプロジェクトでImageResizerを使用していて、それがどのように機能するかに非常に満足しています。唯一の不満は、ドキュメントの一部を更新する必要があることです。
Jon L
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.