2012-02-07 40 views
0

我正在部署一个MVC3应用程序,它将图像存储在数据库中。要求是做一个GET从数据库中检索图像,然后将图像写入响应流。所有工作都很好(当然)。SecurityException调用Graphics.DrawImage

我使用共享的托管服务提供商(是的,没有完全信任,<trust>被阻止)。我用这ImageResult返回图像:

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

我已经找到了错误的地方。我打电话graphics.DrawImage()行。这里是堆栈:

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已从数据库中拉出):

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