2009-07-11 23 views
1

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

xelement.Save("onno.xml"); 

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

有什么不对?

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

编辑: 我试图执行迈赫达德的与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行中生成。帮帮我?

回答

5

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

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

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

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

<serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> 

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

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

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

获得的完整路径。这个解决方案更加灵活。

此外,应该将该位置的NTFS写入权限授予应用程序池正在运行的用户帐户。