FileNotFoundException IIS7 - PullRequest
       2

FileNotFoundException IIS7

3 голосов
/ 14 февраля 2012

У меня есть веб-приложение на C #, которое прекрасно работает в VS2010, но при развертывании на сервере IIS7 возвращает значок «изображение не найдено».

Данный фрагмент кода, по сути, захватывает миниатюру изображения в общем сетевом местоположении, манипулирует и затем выталкивает обратно на веб-страницу.

Веб-сервер находится в той же сети,файлы, к которым он пытается получить доступ.Все пользователи, которые получают доступ к этой веб-странице, находятся в одной локальной интрасети.

Приложение представляет собой сохраненный список сетевых ресурсов, сохраненных в той или иной категории.

При развертывании приложенияЭто дает две вышеупомянутые ошибки, которые я нахожу в журнале приложений.Я чувствую, что это ошибка прав доступа к файлу и что эти две ошибки связаны, но я не знаю, где изменить разрешения для этого, чтобы приложение работало должным образом.

Exception information: 
Exception type: FileNotFoundException 
Exception message: T:\Published\Generic.jpg

Однако, если я возьму«T: \ Опубликовано \ Generic.jpg» и подключите его к моей адресной строке IE.Он загружает изображение.

Раздел кода, который обрабатывает изображение, выглядит так:

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

Я пробовал как с методом 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();

Ответы [ 3 ]

3 голосов
/ 14 февраля 2012

Я не думаю, что сетевые диски доступны в контексте службы.Вам, вероятно, придется использовать нотацию сетевого ресурса (например, \\machine-name\share).Кроме того, вы работаете в пользовательском контексте по умолчанию (IIS APPPOOL\ASP.NET v4.0), который труднее настроить в настройках сети.Вы должны изменить удостоверение пула приложений на пользователя сети и предоставить этому пользователю доступ.

Другой вариант - олицетворение пользователя, обращающегося к приложению (при условии, что вы используете проверку подлинности Windows).

ВыМожно изменить удостоверение пула приложений, щелкнув правой кнопкой мыши пул приложений и выбрав дополнительные параметры.Идентификация в модели процесса - это параметр, который нужно изменить.

Чтобы включить олицетворение, вы можете перейти к приложению и выбрать функцию аутентификации, включить олицетворение ASP.NET, затем нажать «Изменить» и убедиться, что аутентификация выполненапользователь выбран.Олицетворение также может работать с определенным идентификатором пользователя с помощью «Определенного пользователя» в этом последнем диалоговом окне, но это в основном полезно, если вы хотите работать в контексте пользователя, который обычно не может работать как служба.

РЕДАКТИРОВАТЬ:

Очевидно, что пользователи IIS AppPool работают в контексте компьютера, который является DOMAIN\Machine$.См. Идентификаторы пула приложений .

2 голосов
/ 14 февраля 2012

Рабочий процесс IIS7 выполняется под своими собственными учетными данными. Он получит доступ к файлу как удостоверение, которое запускает пул приложений, под которым работает ваш веб-сайт. Обычно это ApplicationPoolIdentity или NetworkService. Вам необходимо предоставить этому пользователю доступ к рассматриваемому файлу.

Но если вы действительно получаете FileNotFoundException, это, вероятно, не ваша проблема, поэтому, пожалуйста, опубликуйте всю трассировку стека.

0 голосов
/ 14 февраля 2012

Я думаю, это потому, что вы обращаетесь к образу с помощью имени подключенного диска. Вместо этого, если вы используете T: \ Опубликовать \ Generic.jpg в виртуальном каталоге IIS, попробуйте UNC name \ machineName \ Опубликовать \ Generic.jpg

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...