IIS6中托管的WCF服务中的默认目录?

Dab*_*rnl 1 .net c# iis file-io wcf

我编写了一个接受和存储消息的简单WCF服务.它在本地托管时工作正常.我仍然在IIS 6上托管时工作.但是当我启用服务将消息存储到xml的能力时,我收到以下错误:访问c:\ windows\system32\inetsrv\Onno.xml已被拒绝(从荷兰语翻译,所以可能不匹配真正的英文错误消息).这很奇怪,因为服务没有从提到的目录运行.而且,文件onno.xml不存在.该服务应该创建它

xelement.Save("onno.xml");
Run Code Online (Sandbox Code Playgroud)

什么时候

File.Exists("onno.xml")==false
Run Code Online (Sandbox Code Playgroud)

怎么了?

  • 我是否必须为IIS托管的WCF服务中的文件IO操作指定默认目录?
  • 我必须调整权限吗?

编辑:我尝试使用MapPath函数实现Mehrdad的解决方案:

   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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

但是我受到空引用异常的欢迎?!在MapPath行中生成异常.救命?

Meh*_*ari 5

是.您应该为文件指定完整路径.您可以使用

System.Web.HttpContext.Current.Server.MapPath("~/onno.xml")
Run Code Online (Sandbox Code Playgroud)

获取文件的完整路径(如果要在应用程序目录中写入).

请注意,HttpContext.Current对于未在ASP.NET兼容模式下运行的WCF服务不可用.您可以启用ASP.NET兼容模式

<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
Run Code Online (Sandbox Code Playgroud)

配置选项和[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]属性.但是,这会将您的WCF服务限制为ASP.NET环境.这不是一件好事.

或者,您可以使用基本路径的配置设置并使用

System.IO.Path.Combine(defaultPath, "onno.xml")
Run Code Online (Sandbox Code Playgroud)

获得完整的路径.该解决方案更灵活.

此外,应该向运行应用程序池的用户帐户授予对该位置的NTFS写入权限.