C# FileNotFoundException IIS7

C# FileNotFoundException IIS7,c#,asp.net,iis-7,C#,Asp.net,Iis 7,我有一个C#Web应用程序,它在VS2010中运行得非常好,但是当部署到IIS7服务器时,会返回“找不到图像图标” 这段有问题的代码实质上是在网络共享位置上抓取一幅图像的缩略图,然后进行操作并将其推回到网页上 web服务器与其试图访问的文件位于同一网络上。访问此网页的所有用户都位于同一本地intranet上 应用程序是以某种方式分类的网络保存资源的存储列表 当我部署应用程序时,它给出了我在应用程序日志中发现的上述两个错误。我觉得这是一个文件权限错误,并且这两个错误是链接在一起的,但是我不知道在哪

我有一个C#Web应用程序,它在VS2010中运行得非常好,但是当部署到IIS7服务器时,会返回“找不到图像图标”

这段有问题的代码实质上是在网络共享位置上抓取一幅图像的缩略图,然后进行操作并将其推回到网页上

web服务器与其试图访问的文件位于同一网络上。访问此网页的所有用户都位于同一本地intranet上

应用程序是以某种方式分类的网络保存资源的存储列表

当我部署应用程序时,它给出了我在应用程序日志中发现的上述两个错误。我觉得这是一个文件权限错误,并且这两个错误是链接在一起的,但是我不知道在哪里更改权限以使应用程序正常工作

Exception information: 
Exception type: FileNotFoundException 
Exception message: T:\Published\Generic.jpg
但是,如果我使用“T:\Published\Generic.jpg”并将其插入IE的地址栏,它将加载图像

处理图像的代码部分如下所示:

System.Drawing.Image img;
img = System.Drawing.Image.FromFile(MapPath(Request.QueryString["File"].ToString()));
我尝试过使用MapPath方法和不使用MapPath方法

我尝试调试应用程序,但因为它在VS2010中工作,所以它不会引发异常,所以我不知道为什么会在IIS服务器上引发异常

按要求执行整个堆栈跟踪:

Event code: 3005 
Event message: An unhandled exception has occurred. 
Event time: 13/02/2012 4:16:26 PM 
Event time (UTC): 13/02/2012 11:16:26 PM 
Event ID: 1f01693f71a2443790a8d83ba06a88a4 
Event sequence: 12 
Event occurrence: 1 
Event detail code: 0 

Application information: 
Application domain: /LM/W3SVC/2/ROOT-3-129736485835718008 
Trust level: Full 
Application Virtual Path: / 
Application Path: C:\inetpub\wwwroot\
Machine name: XXXXXX

Process information: 
Process ID: 10768 
Process name: w3wp.exe 
Account name: IIS APPPOOL\ASP.NET v4.0 

Exception information: 
Exception type: FileNotFoundException 
Exception message: T:\Published\Generic.jpg
at System.Drawing.Image.FromFile(String filename, Boolean useEmbeddedColorManagement)
at imagedrawer.Page_Load(Object sender, EventArgs e)
at System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)
at System.Web.UI.Control.LoadRecursive()
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)



Request information: 
Request URL: http://localhost/imagedrawer.aspx?File=T:\Published\Generic.jpg 
Request path: /imagedrawer.aspx 
User host address: ::1 
User:  
Is authenticated: False 
Authentication Type:  
Thread account name: IIS APPPOOL\ASP.NET v4.0 

Thread information: 
Thread ID: 64 
Thread account name: IIS APPPOOL\ASP.NET v4.0 
Is impersonating: False 
Stack trace:    at System.Drawing.Image.FromFile(String filename, Boolean useEmbeddedColorManagement)
at imagedrawer.Page_Load(Object sender, EventArgs e)
at System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)
at System.Web.UI.Control.LoadRecursive()
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)


Custom event details: 
imagedrawer.aspx的内容:

 System.IO.MemoryStream ms = new System.IO.MemoryStream();
        System.Drawing.Image img;

        img = System.Drawing.Image.FromFile(MapPath(Request.QueryString["File"].ToString()));


        if (img.Height > 80 || img.Width > 80)
        {
            System.Drawing.RectangleF RF = new System.Drawing.RectangleF();
            RF.X = 0;
            RF.Y = 0;
            RF.Height = (img.Height < 80) ? img.Height : 80;
            RF.Width = (img.Width < 80) ? img.Width : 80;
            System.Drawing.Bitmap bmthumb = (System.Drawing.Bitmap)img.Clone();
            System.Drawing.Bitmap bmCrop = bmthumb.Clone(RF, bmthumb.PixelFormat);
            img = (System.Drawing.Image)bmCrop;
        }
        img.Save(ms, System.Drawing.Imaging.ImageFormat.Png);


        Response.Clear();
        Response.AddHeader("Content-Disposition", "attachment; filename=" + Request.QueryString["File"].ToString());
        Response.AddHeader("Content-Length", ms.ToArray().Length.ToString());
        Response.ContentType = "image/jpeg";
        Response.BinaryWrite(ms.ToArray());
        Response.End();
        img.Dispose();
System.IO.MemoryStream ms=new System.IO.MemoryStream();
系统图、图像img;
img=System.Drawing.Image.FromFile(映射路径(Request.QueryString[“File”].ToString());
如果(内模高度>80 | |内模宽度>80)
{
System.Drawing.RectangleF RF=新的System.Drawing.RectangleF();
RF.X=0;
RF.Y=0;
射频高度=(进气高度<80)?进气高度:80;
射频宽度=(img.Width<80)?img.Width:80;
System.Drawing.Bitmap bmthumb=(System.Drawing.Bitmap)img.Clone();
System.Drawing.Bitmap bmCrop=bmthumb.Clone(RF,bmthumb.PixelFormat);
img=(System.Drawing.Image)bmCrop;
}
保存(ms,System.Drawing.Imaging.ImageFormat.Png);
Response.Clear();
Response.AddHeader(“内容处置”、“附件;文件名=“+Request.QueryString[“File”].ToString());
AddHeader(“内容长度”,ms.ToArray().Length.ToString());
Response.ContentType=“image/jpeg”;
Response.BinaryWrite(ms.ToArray());
Response.End();
img.Dispose();

IIS7工作进程在其自己的凭据下运行。它将以运行应用程序池的身份访问该文件,您的网站将在该应用程序池下运行。这通常是
ApplicationPoolIdentity
NetworkService
。您需要授予该用户对相关文件的访问权限


但是,如果您真的遇到
FileNotFoundException
,那可能不是您的问题,因此请发布整个堆栈跟踪。

我认为这是因为您使用映射的驱动器名访问映像。
相反,如果在IIS虚拟目录中使用T:\Published\Generic.jpg,请尝试UNC name\machineName\Published\Generic.jpg

我认为网络驱动器在服务上下文中不可用。您可能需要使用网络共享符号(例如
\\machine name\share
)。此外,您正在默认用户上下文(
IIS APPPOOL\ASP.NET v4.0
)下运行,这在网络设置中更难工作。您应该将应用程序池标识更改为网络用户,并授予该用户访问权限

另一个选项是模拟访问应用程序的用户(假设您使用的是Windows身份验证)

您可以通过右键单击应用程序池并选择高级设置来更改应用程序池标识。流程模型下的标识是要更改的设置

要启用模拟,您可以转到应用程序,选择身份验证功能,启用ASP.NET模拟,然后单击编辑。。并确保选择了经过身份验证的用户。模拟还可以通过在最后一个对话框中使用特定用户来处理特定用户标识,但当您希望在通常不能作为服务运行的用户上下文中运行时,这一点非常有用

编辑:


显然,IIS AppPool用户在机器上下文下运行,即
DOMAIN\machine$
。请参阅。

@JKM我最好的猜测是驱动器号
T
没有正确映射到服务器上。@JKM我建议使用UNC路径,例如
\\servername\folder\file.name
,而不是映射驱动器。我已将其映射到共享驱动器,我通常也会认为,但是当我把地址放到IE中时,图像就会显示出来,这告诉我它在服务器上的映射是正确的。这就是让我困惑的地方。UNC路径名也会给我同样的错误。我试过这两种方法,都认为可能也是这样。@JKM当你把它放到浏览器中时,它会显示你是否为你映射了驱动器。该网站未按您的要求运行。试着像我上面建议的那样通过UNC路径访问它。你能仅仅通过键入图像的URL来浏览图像吗?无需通过imagedrawer.aspx?@JKM,当您使用IE访问共享时,IE使用您的凭据。如果IE有效,它只是证明你有权访问该共享。但是,您在IIS/ASP.NET上的应用程序正在应用程序池标识下运行(如Guvante所说),因此发生的任何错误都表明池标识无权访问该共享(必须使用UNC路径,按)。您需要授予池标识权限才能访问共享,或者将池标识更改为可以访问共享的帐户。下次,请注意用户上下文。一旦我将解决方案部署到目标计算机并设置了正确的应用程序池服务,它将不再注册此错误。