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


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

답변:


148

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

그러나이 작업을 여러 곳에서 수행하는 경우 포맷터 경로를 사용하는 것이 "권장"방법 일 수 있습니다. 프로그래밍의 거의 모든 것과 마찬가지로 대답은 시나리오에 따라 다릅니다.


이미지도 사용 중이어야합니까?
dibs487

GetImage방법 은 어디에 있습니까 ?
Yoda

1
@Yoda는 클라이언트로 다시 전송해야하는 이미지를 반환하는 구현의 메서드입니다.
carlosfigueira

하드 드라이브에서 파일을 반환하는 경우 다음과 같이 FileStream을 사용하는 것이 더 나은 성능이라고 생각합니다 (이 질문에서 허용 된 답변 참조) : stackoverflow.com/questions/11125535/…
John Gilmer

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.