Каталог по умолчанию в службе WCF, размещенной в IIS6? - PullRequest
1 голос
/ 12 июля 2009

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

xelement.Save("onno.xml");

когда

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

Что не так?

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

Edit: Я попытался реализовать решение Мехрада с помощью функции 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. Помощь

1 Ответ

5 голосов
/ 12 июля 2009

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

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 в этом месте должно быть предоставлено учетной записи пользователя, под которой работает пул приложений.

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