简体   繁体   English

IHttpHandler部署到Web服务器后不加载图像

[英]IHttpHandler doesn't load image after deployed to web server

I am now having problem of deploying my website to a shared windows hosting. 我现在有将网站部署到共享Windows托管的问题。

I am currently hosting it with hostgator. 我目前与hostgator托管。

The problem is, my ThumbnailHandler which is supposed to return an image file, stopped working once the project is deployed to web server . 问题是,将项目部署到Web服务器后 ,应该返回图像文件的ThumbnailHandler停止工作。 It works properly in local IIS virtual folder, and vs2010 debug . 它可以在本地IIS虚拟文件夹和vs2010 debug中正常工作

eg- 例如-

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

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

http://www.myweb.com/image-handler?i=0 - (routed with IRouteHandler) ERROR http://www.myweb.com/image-handler?i=0- (使用IRouteHandler路由) 错误

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

No exception is thrown. 没有异常被抛出。 If I open the url, it returns 'The image ( path ) cannot be displayed because it contains error'. 如果我打开网址,它将返回“由于包含错误,无法显示图像( 路径 )”。

ThumbnailHandler.ashx 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 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>

Has anyone experienced this before? 有谁之前经历过这个吗? I've also tried to check folder permission security setting. 我也尝试检查文件夹权限安全设置。 Any help is appreciated, thanks in advance. 任何帮助表示赞赏,在此先感谢。

Note: This occurs to any images in any folder. 注意:任何文件夹中的任何图像都会发生这种情况。

When Images are load in img folder , img folder have no access to read/write files. 当将图像加载到img文件夹中时, img文件夹无权读取/写入文件。 So first give all access to img folder to read and write images . 因此,首先授予对img文件夹的所有访问权限以读取和写入图像。

or you try to give full path of image because some time client server have different root path So Server.MapPath 或者您尝试提供完整的图像路径,因为有时客户端服务器具有不同的根路径,所以Server.MapPath

not get exact path of image . 无法获得确切的图像路径。

May you try path of starting domain name define in web.config appsetting control and then this path use in handler to get path of images. 可以尝试在web.config appsetting控件中尝试定义起始域名的路径,然后在处理程序中使用此路径来获取图像的路径。

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

In handler page use 在处理程序页面中使用

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

Ok, I found out the issue. 好的,我发现了问题。 Literally my host provider doesn't support full trust policy, so I had to change it to medium trust. 从字面上看,我的托管服务提供商不支持完全信任策略,因此我不得不将其更改为中等信任。 Even if I set the full trust on my web.config, It'll just change it back to medium trust or display the error. 即使我在web.config上设置了完全信任,它也只会将其更改回中等信任或显示错误。

So, the error occured on my 'GetImage' function, which was 因此,该错误发生在我的“ 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;
}

or 要么

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

and throws... 并抛出...

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

BUT, I still don't know WHY the following code 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);
}

I've tested it with my host provider and my local IIS with this in my web.config 我已经在主机供应商和本地IIS中在web.config中对此进行了测试

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

Anyway, it works now. 无论如何,现在就可以使用。 I still haven't got the right time to find out why Stream type object would act differently to Image.FromFile, since what I know is those two still streams for the file. 我仍然没有合适的时间来找出为什么Stream类型对象的行为不同于Image.FromFile的原因,因为我知道的是文件的那两个静止流。 I'll post more update if I found out something interesting. 如果发现有趣的事情,我会发布更多更新。

Cheers. 干杯。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM