[asp.net] ASP.NET Web API를 사용하여 이미지를 반환하는 권장 방법이 있습니까?

2 개의 매개 변수 (크기 조정을위한 x 및 y)가있는 이미지를 반환하는 가장 좋은 방법은 무엇입니까?

예를 들면

~/api/image12345/200/200

200 x 200 jpg / png / 또는 gif를 반환합니다.

System.Drawing.Image객체를 반환 하거나 수동으로 정의해야 HTTPReponseMessage.Content합니까?



답변

System.Drawing.Image적절한 바이트로 변환하는 방법을 알고있는 포맷터를 추가하지 않는 한를 반환해서는 안됩니다 . 예상대로 이미지 바이트로 자체적으로 직렬화되지 않습니다.

한 가지 가능한 해결책은 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는 모두 정적 파일을 제공하는 매우 끔찍한 작업을 수행합니다. IIS는이를 매우 잘 수행합니다. 종종 20-100 배 더 효율적입니다.

좋은 성능을 얻으려면 늦어도 PostAuthorizeRequest 중에 URL을 다시 작성 하여 IIS가 파일을 선택하고 제공 할 수 있도록하십시오. 예, 이것은 HttpModule 수준의 이벤트 처리를 의미합니다.

[면책 조항 : 저는 다음 기사 및 오픈 소스 프로젝트의 저자입니다.]

이미지로 동적 작업을 수행하는 경우 피해야 할 이미지 처리 함정에 대한이 기사를 확인 하고 ImageResizer를 살펴보십시오 . 뛰어난 디스크 캐싱 (IIS 정적 파일 처리 사용)이 있으며 모든 종류의 이미지 생성에 쉽게 연결할 수 있습니다. 고급이 필요한 경우 AForge, FreeImage 및 WIC에 대한 선택적 바인딩이 있습니다.


답변