Проблемы с веб-методом ASMX, который использует файловый ввод-вывод - PullRequest
0 голосов
/ 10 июля 2009

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

Пока все отдельные клиенты работают и мой запрос выполняется нормально, у меня возникают проблемы при использовании этого веб-метода

[WebMethod()]
public void setMessage(string message)
{
    FileStream file = new FileStream("mymessage.txt", FileMode.OpenOrCreate, FileAccess.Write);
    StreamWriter sw = new StreamWriter(file);
    sw.Write(message);
    sw.Close();
    file.Close();
}

Когда я вызываю это через HTTP Post, используя SOAP из приложения iPhone.

Я получаю следующий xml в своей консоли, когда делаю запрос.

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<soap:Fault>
<faultcode>soap:Server</faultcode>
<faultstring>Server was unable to process request. ---&gt; Access to the path 'c:\windows\system32\inetsrv\myMessage.txt' is denied.</faultstring>
<detail />
</soap:Fault>
</soap:Body>
</soap:Envelope>

Сервер, настроенный моим начальником, в настоящее время используется на других мощностях в качестве внутреннего тестового сервера для нескольких различных проектов.

Сервер является сервером IIS. Я не знаю, какая версия с настроенным и установленным ASP.NET.

Сценарий находится в другом месте, чем программа пытается написать. Я предполагаю, что скрипт запускается из этого каталога, и именно поэтому он пытается написать туда. Это тот случай или я что-то упустил?

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

Спасибо!

Ответы [ 2 ]

4 голосов
/ 10 июля 2009

Изменить "filename.txt" на

Server.MapPath("filename.txt")

или укажите полный физический путь к файлу и предоставьте разрешения NTFS пользователю ASP.NET для доступа к папке.

Server.MapPath преобразовывает виртуальные пути (например, ~/helloworld.aspx) в физические пути (например, D:\WebSite\helloworld.aspx).

1 голос
/ 10 июля 2009

Помимо сохранения файла в папке, к которой у вас есть доступ (вам не удалось прочитать сообщение?), Вам необходимо правильно реализовать блоки "using":

using (FileStream file = new FileStream("mymessage.txt", 
                    FileMode.OpenOrCreate, FileAccess.Write)) {
    using (StreamWriter sw = new StreamWriter(file)) {
        sw.Write(message);
    }
}

Причина, по которой он пишет в c: \ windows \ system32 \ inetsrv \, заключается в том, что это его каталог по умолчанию. Если вы хотите записать в другой каталог, вам нужно указать его. Server.MapPath сделает это, как вам уже было указано.

...