Каталог по умолчанию в службе WCF, размещенной в IIS6?

Я написал простую службу WCF, которая принимает и сохраняет сообщения. Он отлично работает при локальном размещении. Я все еще работаю, когда размещен на IIS 6. Но когда я разрешаю службе сохранять сообщения в xml, я получаю следующую ошибку: Доступ к c:\windows\system32\inetsrv\Onno.xml был запрещен (перевод с голландского, поэтому может не совпадать с истинным английским сообщением об ошибке). Это любопытно, поскольку служба не запускается из указанного каталога. Более того, файла onno.xml нет. Служба должна создать его как

xelement.Save("onno.xml");

когда

File.Exists("onno.xml")==false

Что случилось?

  • Нужно ли указывать каталог по умолчанию для файловых операций ввода-вывода внутри службы WCF, размещенной в IIS?
  • Нужно ли настраивать разрешения?

Изменить: я попытался реализовать решение Mehrdad с помощью функции MapPath следующим образом:

   public void Persist(Message message)
    {
        foreach (var recipient in message.Recipients)//recipient is a string
        {
            XElement xml_messages;
            string path;
            try
            {
                path = HttpContext.Current.Server.MapPath("~/"+recipient+FileExtension);
                //FileExtension=".xml"
                //Null reference exception thrown from this line
            }
            catch (Exception e)
            {
                throw new Exception("Trying to get path " + e.Message);
            }
            try
            {
                xml_messages = XElement.Load(path);
            }
            catch
            {
                xml_messages = XElement.Parse("<nothing/>");
            }
            var element = (XElement) message;
            if (xml_messages.IsEmpty)
            {
                xml_messages =
                    new XElement("messages",
                                 new XAttribute("recipient", recipient),
                                 element
                        );  
            }
            else
            {
                xml_messages.Add(element);
            }
            xml_messages.Save(path);
        }
    }

Однако меня встречает исключение нулевой ссылки?! Исключение генерируется в строке MapPath. Помощь?


person Dabblernl    schedule 11.07.2009    source источник


Ответы (1)


да. Вы должны указать полный путь к файлу. Вы можете использовать

System.Web.HttpContext.Current.Server.MapPath("~/onno.xml")

чтобы получить полный путь к файлу (если вы хотите писать в каталоге приложения).

Обратите внимание, что HttpContext.Current недоступен для служб WCF, не работающих в режиме совместимости с ASP.NET. Вы можете включить режим совместимости с ASP.NET с помощью

<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />

параметр конфигурации и атрибут [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]. Однако это ограничит вашу службу WCF средой ASP.NET. Это не хорошая вещь.

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

System.IO.Path.Combine(defaultPath, "onno.xml")

чтобы получить полный путь. Это решение более гибкое.

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

person mmx    schedule 11.07.2009