2012-02-07 3 views
0

이미지를 데이터베이스에 저장하는 MVC3 앱을 배포하고 있습니다. 요구 사항은 GET을 수행하여 데이터베이스에서 이미지를 검색 한 다음 이미지를 응답 스트림에 기록하는 것입니다. 모두가 지역에서 훌륭한 작업을하고 있습니다 (물론).Graphics.DrawImage를 호출 할 때 SecurityException이 발생했습니다.

저는 공유 호스팅 제공 업체를 사용하고 있습니다 (예, 완전 신뢰 없음, <trust>은 차단됨). 내가 graphics.DrawImage()를 호출있어 라인에 오류를 추적 한

public override void ExecuteResult(ControllerContext context) 
     { 
      using (Bitmap bitmap = new Bitmap(width, height)) 
      { 
       using (Graphics graphics = Graphics.FromImage(bitmap)) 
       { 
        Rectangle displayRectangle = new Rectangle(new Point(0, 0), new Size(width - 1, height - 1)); 

        graphics.DrawImage(Image.FromHbitmap(_imageBitmap.GetHbitmap()), 0, 0); 

        context.HttpContext.Response.ContentType = "image/jpg"; 
        bitmap.Save(context.HttpContext.Response.OutputStream, ImageFormat.Jpeg); 
       } 
      } 
     } 

: 나는 이미지를 반환하기 위해이 ImageResult을 사용하고 있습니다. 다음은 스택입니다.

System.Security.SecurityException: Request for the permission of type 'System.Security.Permissions.SecurityPermission, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed. 
    at TM.Web.ImageResult.ExecuteResult(ControllerContext context) 
    at System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult) 
    at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass1c.<InvokeActionResultWithFilters>b__19() 
    at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation) 
    at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass1c.<>c__DisplayClass1e.<InvokeActionResultWithFilters>b__1b() 
    at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 filters, ActionResult actionResult) 
    at System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) 
    at System.Web.Mvc.Controller.ExecuteCore() 
    at System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) 
    at System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) 
    at System.Web.Mvc.MvcHandler.<>c__DisplayClass6.<>c__DisplayClassb.<BeginProcessRequest>b__5() 
    at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass1.<MakeVoidDelegate>b__0() 
    at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _) 
    at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End() 
    at System.Web.Mvc.MvcHandler.<>c__DisplayClasse.<EndProcessRequest>b__d() 
    at System.Web.Mvc.SecurityUtil.<GetCallInAppTrustThunk>b__0(Action f) 
    at System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action action) 
    at System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) 
    at System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) 
    at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 
    at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) 
The action that failed was: 
LinkDemand 
The type of the first permission that failed was: 
System.Security.Permissions.SecurityPermission 

웹에서 GDI +를 사용하는 것이 정확하게 지원되지 않습니다. 이 작업을 수행하는 더 좋은 방법이 있습니까? 또는 적어도 부분 신뢰를 여행하지 않을 방법? 감사합니다.

답변

1

글쎄, 내가 이것을 복잡하게 만들었다. 이 good post은 왜 비트 맵을 출력 스트림에 저장할 수 없는지 설명했습니다.

그래서 GDI + 호출을 제거하려고했습니다. 나는 아름답게 작동하는 이것으로 끝났다. (_imageBitmap은 db에서 가져왔다.)

public override void ExecuteResult(ControllerContext context) 
{ 
    using (Bitmap bitmap = new Bitmap(_imageBitmap)) 
    { 
      context.HttpContext.Response.ContentType = "image/jpg"; 
      bitmap.Save(context.HttpContext.Response.OutputStream, ImageFormat.Jpeg); 
    } 
} 
관련 문제