В ASP.NET(хостинг) мне нужна простая операция ввода-вывода файла для чтения данных из файла, а затем принудительная загрузка. Это действительно так просто.
Я продолжаю получать System.UnauthorizedAccessException
при выполнении следующего кода:
System.IO.FileStream fs =
new System.IO.FileStream(path, System.IO.FileMode.Open);
Локально он работает нормально, но когда я загружаюсь на общую учетную запись хостинга, я получаю исключение выше.
Что странно, что в браузере, если я ввожу полный путь к файлу, я могу видеть и использовать файл.
Как и все остальные, это, скорее всего, потому, что 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;
}
Вы должны использовать IsolStorage для ваших файловых операций.
Что такое изолированное хранилище?
Запуск кода с ограниченными привилегиями имеет много преимуществ, учитывая присутствие хищников, которые накладывают вирусы и шпионские программы на ваших пользователей. В .NET Framework есть несколько механизмов для работы с пользователями с наименьшими привилегиями. Поскольку большинство приложений приходится иметь дело с постоянным хранением некоторых своих состояний (без использования баз данных или других средств), было бы неплохо иметь место для хранения информации, которая была бы безопасна в использовании, без проверки того, имеет ли приложение достаточно прав на сохранение данных на жесткий диск. Это решение - это то, что изолированное хранилище предназначено для обеспечения.
Используя изолированное хранилище для сохранения ваших данных, вы получите доступ к безопасному месту для хранения информации, не прибегая к тому, чтобы пользователи предоставляли доступ к определенным файлам или папкам в файловой системе. Основное преимущество использования изолированного хранилища заключается в том, что ваше приложение будет работать независимо от того, работает ли оно под частичным, ограниченным или полным доверием.
Вы можете обратиться к IsolatedStorageFileStream
Вероятно, проблема связана с тем, что для процесса ASP.NET требуются права доступа к указанному пути.
Ваши приложения asp.net запускаются в контексте безопасности пользователя с именем ASPNET, поэтому для доступа к любому ресурсу в вашей системе этому пользователю должен быть предоставлен доступ к этим ресурсам.
Каков путь, который вы передаете в переменной 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);