我有一个WCF服务库,它读取位于WCF发布位置的xml文件。该项目不是客户档案。
当我在WCF测试客户端中调试时,它可以正常工作:
XDocument xDoc = XDocument.Load(@".\PaymentAvailability.xml");
但是当从网站上消费服务时,它说找不到PaymentAvailability.xml ......看起来它试图从消费应用中获取xml文件的位置。
我已经尝试过这里发布的答案,但没有运气How to get working path of a wcf application?
System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath
返回null
使用AspNetCompatability HttpContext.Current.Server.MapPath(".");
也不会返回任何内容
答案 0 :(得分:3)
这是真正的不良做法,您应该使用自定义部分处理程序({{3})将库的配置放在.config文件中,以用于使用您的库的应用程序。如果你想要强类型的XML配置,那么非常对你来说很好。
原因在于您正在配置您的应用程序;如果您的图书馆真的独立于您的应用程序运行,那么您应该重新考虑该图书馆是否应该是它自己的应用程序。
您必须通过一个选项来缓解此问题,以创建自定义配置节处理程序,然后使用Configuration Section Designer。虽然您将无法使用单个文件(该属性不允许使用绝对路径),但您可以将一个文件复制到每个应用程序的bin目录中。
请注意,您必须明确获取配置部分,但现在无论如何都要加载文件,但至少您将更加符合配置管理器。
答案 1 :(得分:2)
一般
System.Reflection.Assembly.GetExecutingAssembly().Location
为您提供执行程序集的物理路径。
在msdn页面上,您可以看到GetExecutingAssembly,GetEntryAssembly和GetCallingAssembly之间的区别。
那说 ,反正可能不是一个好主意(见casperOne's answer)。
答案 2 :(得分:0)
这是有效的,但从其他答案来看,我将会看看这是否确实是一种不好的做法,并且可以做得更好。
ServiceHostBase hostBase = OperationContext.Current.Host;
VirtualPathExtension virtualPathExtension = hostBase.Extensions.
Find<VirtualPathExtension>();
XDocument xDoc;
if (virtualPathExtension != null)
{
/// It’s hosted.
xDoc = XDocument.Load(Path.Combine(
HostingEnvironment.ApplicationPhysicalPath, AvailabilityFileName));
}
else
{
/// It’s not hosted.
xDoc = XDocument.Load(AvailabilityFileName);
}