我编写了一个接受和存储消息的简单WCF服务。它在本地托管时工作正常。我仍然在IIS 6上托管时工作。但是当我启用服务将消息存储到xml的能力时,我收到以下错误:访问c:\ windows \ system32 \ inetsrv \ Onno.xml已被拒绝(从荷兰语翻译,所以可能不匹配真正的英文错误消息)。 这很奇怪,因为服务没有从提到的目录运行。而且,文件onno.xml不存在。该服务应将其创建为
xelement.Save("onno.xml");
何时
File.Exists("onno.xml")==false
有什么问题?
编辑: 我尝试使用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);
}
}
但是我受到空引用异常的欢迎?!在MapPath行中生成异常。帮助
答案 0 :(得分:5)
是。您应该为文件指定完整路径。你可以使用
System.Web.HttpContext.Current.Server.MapPath("~/onno.xml")
获取文件的完整路径(如果要在应用程序目录中写入)。
请注意,HttpContext.Current
对于未在ASP.NET compatibility mode中运行的WCF服务不可用。您可以使用
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
配置选项和[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
属性。但是,这会将您的WCF服务限制为ASP.NET环境。这不是一件好事。
或者,您可以使用基本路径的配置设置并使用
System.IO.Path.Combine(defaultPath, "onno.xml")
获得完整路径。这个解决方案更灵活。
此外,应该将该位置的NTFS写入权限授予运行应用程序池的用户帐户。