2013-06-13 36 views
0

我现在有将我的网站部署到共享Windows主机的问题。IHttpHandler在部署到Web服务器后不加载图像

我目前正在托管它与hostgator。

问题是,我的ThumbnailHandler应该返回一个图像文件,一旦项目被部署到网络服务器,就停止工作。它在本地IIS虚拟文件夹和vs2010调试中正常工作。

e.g-

http://www.myweb.com/imageHandler.ashx?i=0 - ERROR

http://www.myweb.com/imageHandler.ashx - ERROR

http://www.myweb.com/image-handler?i=0 - (路由与IRouteHandler) ERROR

http://www.myweb.com/img/theimage.jpg - OK!

不引发任何异常。如果我打开网址,则返回'图像(路径)无法显示,因为它包含错误'。

ThumbnailHandler.ashx

public void ProcessRequest(HttpContext context) { 
    context.Response.Flush(); 
    Size maxSize = new Size(98, 98); 
    byte[] buffer = Imaging.GetImage(context.Server.MapPath("~/img/noimage98.png"), maxSize).GetBytes(System.Drawing.Imaging.ImageFormat.Jpeg); 
    try { 
     Int32 index = GetImageIndex(context); 
     maxSize = GetMaxSize(context); 
     if (index < 0 || maxSize == null) 
      throw new Exception("Index size is not specified."); 
     String authToken = GetAuthenticationToken(context); 
     DirectoryInfo directoryInfo = AdvertisementDirectory.GetDirectoryInfo(authToken); 
     List<FileInfo> fileInfos = AdvertisementDirectory.GetImageFileInfoList(directoryInfo); 
     using (System.Drawing.Image thumbnailImage = Imaging.GetImage(fileInfos[index].FullName, maxSize)) { 
      buffer = thumbnailImage.GetBytes(System.Drawing.Imaging.ImageFormat.Jpeg); 
     } 
    } 
    catch (Exception ex) { 
     throw ex; 
    } 
    finally { 
     context.Response.ContentType = "image/jpeg"; 
     context.Response.OutputStream.Write(buffer, 0, buffer.Length); 
     context.Response.Flush(); 
     context.Response.Close(); 
     context.ApplicationInstance.CompleteRequest(); 
    } 
} 
public bool IsReusable { get { return false; } } 

的web.config

<globalization requestEncoding="iso-8859-1" responseEncoding="iso-8859-1" fileEncoding="utf-8" culture="en-US" uiCulture="en-US"/> 

<pages buffer="true" clientIDMode="Static" controlRenderingCompatibilityVersion="4.0" enableViewStateMac="true" validateRequest="true" enableEventValidation="true" enableSessionState="true" viewStateEncryptionMode="Auto" > 
    <controls> 
    <add tagPrefix="ATK" assembly="AjaxControlToolkit" namespace="AjaxControlToolkit" /> 
    </controls> 
</pages> 

<httpHandlers> 
    <add verb="*" path="*.ashx" type="Tradepost.ThumbnailHandler, Tradepost"/> 
</httpHandlers> 

<httpRuntime executionTimeout="600" maxRequestLength="40000" maxUrlLength="260" maxQueryStringLength="2048" requestLengthDiskThreshold="80" useFullyQualifiedRedirectUrl="false" minFreeThreads="8" minLocalRequestFreeThreads="4" appRequestQueueLimit="5000" enableKernelOutputCache="true" enableVersionHeader="true" requireRootedSaveAsPath="true" enable="true" shutdownTimeout="90" delayNotificationTimeout="5" waitChangeNotification="0" maxWaitChangeNotification="0" enableHeaderChecking="true" sendCacheControlHeader="true" apartmentThreading="false" requestPathInvalidCharacters="&lt;,&gt;,*,%,&amp;,:,\,?" /> 

<system.webServer> 
<validation validateIntegratedModeConfiguration="false"/> 
<modules runAllManagedModulesForAllRequests="true" /> 
</system.webServer> 

有没有人经历过这个?我也试着检查文件夹权限安全设置。任何帮助表示赞赏,在此先感谢。

注意:这发生在任何文件夹中的任何图像。

回答

0

好吧,我发现了问题。 从字面上看,我的主机提供商不支持完全信任策略,所以我不得不将其更改为中等信任。即使我对web.config完全信任,它也会将其更改回中等信任或显示错误。

所以,在我的 '的getImage' 功能,这是

public static System.Drawing.Image GetImage(String fileName, System.Drawing.Size maxSize) { 
    System.Drawing.Image result = null; 
    try { 
     using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read)) { 
      using (System.Drawing.Image img = System.Drawing.Image.FromStream(fs, true, false)) { 
       Size sz = GetProportionalSize(maxSize, img.Size); 
       result = img.GetThumbnailImage(sz.Width, sz.Height, null, IntPtr.Zero); 
       } 
      fs.Close(); 
     } 
    } 
    catch (Exception ex) { 
     throw ex; 
    } 
    return result; 
} 

using (FileStream fs = File.OpenRead(fileName)) { 
    using (StreamReader sr = new StreamReader(fs)) { 
     using (System.Drawing.Image img = System.Drawing.Image.FromStream(sr.BaseStream, true, false)) { 
      System.Drawing.Size sz = GetProportionalSize(maxSize, img.Size); 
      result = img.GetThumbnailImage(sz.Width, sz.Height, null, IntPtr.Zero); 
     } 
     sr.Close(); 
    } 
    fs.Close(); 
} 

并引发...发生错误

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 System.Security.CodeAccessSecurityEngine.CheckNReturnSO(PermissionToken permToken, CodeAccessPermission demand, StackCrawlMark& stackMark, Int32 unrestrictedOverride, Int32 create) at System.Security.CodeAccessSecurityEngine.Assert(CodeAccessPermission cap, StackCrawlMark& stackMark) at System.Security.CodeAccessPermission.Assert() at [Snipped Method Name] at ReportExprHostImpl.CustomCodeProxy.[Snipped Method Name] The action that failed was: Demand The type of the first permission that failed was: System.Security.Permissions.SecurityPermission The Zone of the assembly that failed was: MyComputer 

,但 我仍然不知道为什么下面的代码WORKS

using (System.Drawing.Image img = System.Drawing.Image.FromFile(fileName)) { 
    System.Drawing.Size sz = GetProportionalSize(maxSize, img.Size); 
    result = img.GetThumbnailImage(sz.Width, sz.Height, null, IntPtr.Zero); 
} 

我已经在我的网页与我的主机提供商和我的本地IIS这个测试它的.config

<trust level="Medium" originUrl=""/> 

不管怎么说,现在的工作。 我还没有找到合适的时间来找出为什么Stream类型的对象对Image.FromFile的行为不同,因为我知道的是这两个仍然是该文件的流。 如果我发现了一些有趣的东西,我会发布更多更新。

干杯。

+0

因此,如果我使用'FromFile',则不会使用'FromStream',而是解决此信任问题。 – choz

1

当图像以IMG文件夹负载,IMG文件夹中有没有访问读/写文件。 所以首先给所有访问img文件夹来读写图像。

,或者你尝试,因为一段时间的客户端服务器有不同的根路径所以Server.MapPath

没有得到图像的准确路径给图像的完整路径。

您可以尝试在web.config appsetting控件中启动域名定义路径,然后在处理程序中使用此路径获取图像路径。

<appSettings> 
     <add key="ProjectName" value="/www.myweb.com"/> 
</appSettings> 

在处理程序页面利用

string ProjectName = System.Configuration.ConfigurationManager.AppSettings["ProjectName"].ToString().Trim(); 
byte[] buffer = Imaging.GetImage(ProjectName+"/img/noimage98.png", maxSize).GetBytes(System.Drawing.Imaging.ImageFormat.Jpeg); 
+0

正如我所说,我已经三重检查了相应的文件夹权限,并允许每个用户访问它。 在全路径图像的情况下,因为它是共享Windows主机。我不认为我能够访问根路径。 但是,我还没有试图从'网址'获取图片,我会尝试并更新你。谢谢:) – choz

+0

嘿,使用来自Uri的流实际上工作。谢谢 :)。 但由于某种原因,我仍然需要使用MapPath方法。对我有其他建议吗? – choz