System.UnauthorizedAccessException для простых операций ASP.Net File.IO

2

В ASP.NET(хостинг) мне нужна простая операция ввода-вывода файла для чтения данных из файла, а затем принудительная загрузка. Это действительно так просто.

Я продолжаю получать System.UnauthorizedAccessException при выполнении следующего кода:

System.IO.FileStream fs = 
      new System.IO.FileStream(path, System.IO.FileMode.Open);

Локально он работает нормально, но когда я загружаюсь на общую учетную запись хостинга, я получаю исключение выше.

Что странно, что в браузере, если я ввожу полный путь к файлу, я могу видеть и использовать файл.

Теги:

5 ответов

1
Лучший ответ

Как и все остальные, это, скорее всего, потому, что ASP-процесс не получил разрешения на доступ к файловому каталогу.

Если вы можете получить доступ к файлу через свой браузер, возможно, вы можете прочитать файл с помощью HttpWebRequest, а не File.Open.

Это имеет смысл, если у вас нет администратора, контролирующего сервер.

Вот пример кода для использования HttpWebRequest, если он поможет:

    /// <summary>
    /// Submits a request to the specified url and returns the text response, or string.Empty if the request failed.
    /// </summary>
    /// <param name="uri">The url to submit the request to.</param>
    /// <returns>The text response from the specified url, or string.Empty if the request failed.</returns>
    protected string getPageResponse(string url)
    {
        //set the default result
        string responseText = string.Empty;

        //create a request targetting the url
        System.Net.WebRequest request = System.Net.HttpWebRequest.Create(url);
        //set the credentials of the request
        request.Credentials = System.Net.CredentialCache.DefaultCredentials;

        //get the response from the request
        System.Net.HttpWebResponse response = (System.Net.HttpWebResponse)request.GetResponse();
        //get the response code (format it as a decimal)
        string statusCode = response.StatusCode.ToString("d");

        //only continue if we had a succesful response (2XX or 3XX)
        if (statusCode.StartsWith("2") || statusCode.StartsWith("3"))
        {
            //get the response stream so we can read it
            Stream responseStream = response.GetResponseStream();
            //create a stream reader to read the response
            StreamReader responseReader = new StreamReader(responseStream);
            //read the response text (this should be javascript)
            responseText = responseReader.ReadToEnd();
        }

        //return the response text of the request
        return responseText;
    }
  • 0
    Спасибо за ваше предложение Docta, я сделаю это. Так что мой процесс ASP.Net не имеет прав на файлы в моем размещенном каталоге. Отлично. Я хотел также загрузить файлы в этот каталог, но, похоже, у меня тоже не будет доступа для записи. Есть идеи
  • 0
    Если у вас нет прав доступа к каталогу и у вас нет прав администратора сервера, я мог бы подумать о хранении файлов в базе данных. Это устранит любые проблемы с правами доступа, с которыми вы столкнетесь, хотя у вас могут быть ограничения по размеру БД. Чтение и запись файлов не являются хорошей идеей из ASP, например, вы не можете очистить, если он выходит из строя (так что вы можете получить половину написанных файлов с заказами на продажу и т. Д.). По крайней мере, с SQL вы можете сохранить целостность с помощью транзакций, так что в случае сбоя вы не получите половину записанных данных.
Показать ещё 4 комментария
1

Вы должны использовать IsolStorage для ваших файловых операций.

Что такое изолированное хранилище?

Запуск кода с ограниченными привилегиями имеет много преимуществ, учитывая присутствие хищников, которые накладывают вирусы и шпионские программы на ваших пользователей. В .NET Framework есть несколько механизмов для работы с пользователями с наименьшими привилегиями. Поскольку большинство приложений приходится иметь дело с постоянным хранением некоторых своих состояний (без использования баз данных или других средств), было бы неплохо иметь место для хранения информации, которая была бы безопасна в использовании, без проверки того, имеет ли приложение достаточно прав на сохранение данных на жесткий диск. Это решение - это то, что изолированное хранилище предназначено для обеспечения.

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

Вы можете обратиться к IsolatedStorageFileStream

0

Вероятно, проблема связана с тем, что для процесса ASP.NET требуются права доступа к указанному пути.

0

Ваши приложения asp.net запускаются в контексте безопасности пользователя с именем ASPNET, поэтому для доступа к любому ресурсу в вашей системе этому пользователю должен быть предоставлен доступ к этим ресурсам.

  • 0
    Как предоставить доступ к размещенным файлам? Особенно, если эти файлы должны быть загружены через ваше веб-приложение?
  • 0
    Предоставьте доступ к папке на сервере и загрузите свои файлы в эту папку, это легко, если хост-сервер принадлежит вам; в противном случае пользователь HttpWebResuest / Response в соответствии с предложением DoctaJonez
0

Каков путь, который вы передаете в переменной path? Вы говорите, что если вы поместите путь в свой браузер, и вы можете получить доступ к файлу, то это говорит о том, что путь содержит http://.... Чтобы использовать System.IO.FileStream, вам необходимо передать путь, в котором есть буква диска или UNC-путь.

Возможно, вам следует делать:

// if file is in root of site...
string path = Server.MapPath("/myfile.txt"); 
// or if file is in /myfiles folder    
string path = Server.MapPath("/myfiles/myfile.txt"); 
System.IO.FileStream fs = 
      new System.IO.FileStream(path, System.IO.FileMode.Open);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню