2011-06-10 51 views
5

我有一个windows服务,它使用一个类库中的方法,并使用相同的asp.net解决方案。在类库,我有以下线的方法:HttpContext.Current.Server null

reader = XmlReader.Create(HttpContext.Current.Server 
      .MapPath("~/TestDevice/Data.xml"), settings); 

控制时谈到此行。我得到例外。我试图调试代码,发现当服务试图访问这个方法时,HttpContext.Current.Servernull。什么是替代语法。

我试图从Web应用程序访问这个类库方法,它工作正常。

请提出解决方案。

+0

你在做多线程吗? – 2011-06-10 09:38:35

+0

@Waqas不,我不是在做多线程 – DotnetSparrow 2011-06-10 09:39:30

+0

请参阅http://stackoverflow.com/a/944267/37055 – 2012-06-01 20:24:04

回答

5

HttpContext.Current是因为你的Windows服务是不是IIS的雨伞或一些其他的web服务器provder下运行返回null。

然而,你可以使用反射找到你的服务的执行路径:

System.Reflection.Assembly.GetExecutingAssembly().Location 

^应该返回执行服务的路径..

+1

我不需要组装路径,而是需要文件路径。实际上我需要这样的替代:HttpContext.Current.Server.MapPath(“〜/ TestDevice/Data.xml”) – DotnetSparrow 2011-06-10 09:50:11

+0

所以你说的是你想让服务知道位于Web下的数据文件的位置应用。 问题在于Web应用程序可能会移动。如果您希望服务和Web应用程序都能够访问相同的位置,那么您可能需要在每个应用程序的配置文件中定义该路径位置,它们都指向相同的位置,并将数据存储在该位置而不是在网站的文件夹树下。 – 2011-06-10 13:38:05

0

可能是因为在使用Windows服务时,您不再运行Web应用程序,因此HttpContext和Web服务器不可用。尝试使用System.IO.File进行映射,看看是否将您带到正确的目录。

编辑

private String yourFullPath = System.IO.Path.GetFullPath("/YourDirectory") + @"\"; 
+0

@vikp:是的,它适用于物理路径。什么是替代。我不想在课程库中提供物理路径 – DotnetSparrow 2011-06-10 09:46:07

+0

您没有给出物理路径。您只需指定目录名称,该名称将驻留在DLL的根目录中。 – 2011-06-10 09:50:11

+0

@vikp:System.IO.file发生错误。什么是确切的语法? – DotnetSparrow 2011-06-10 09:51:45

0

这种方法的效果要好得多:

string baseDirectory = AppDomain.CurrentDomain.BaseDirectory;