我正在尝试从它所在的同一个项目调用asp.net webservice:
[MethodImpl(MethodImplOptions.Synchronized)]
public static void OnFileCreated(object source, FileSystemEventArgs e) {
trackdata_analyse rWebAnalyse = new trackdata_analyse();
rWebAnalyse.Analyse(@"pending\" + e.Name, "YOUNIVATE");
}
但是我总是得到以下“ HttpContext不可用。这个类只能在ASP.NET请求的上下文中使用。”从Web服务调用Server.MapPath时:
[WebMethod]
public int Analyse(string fileName, string PARSING_MODULE){
int nRecords;
TrackSession rTrackSession = new TrackSession() ;
string filePath = Server.MapPath(@"..\data\") + fileName;
我是否必须添加WebReference,尽管webservice在同一个项目中?
答案 0 :(得分:1)
您应该在HttpContext
类中添加参数化构造函数,而不是完全依赖Web服务中的WebService
(通常不是一种好的做法)。然后,在默认的无参数构造函数中,您可以检查HttpContext
是否存在相同的依赖项。
这样,当您需要从同一个程序集调用Web服务时,您可以在进程中共享依赖项,而不是依赖HttpContext
。
在这种情况下,您的依赖关系是Server.MapPath
,它将URL中的相对路径映射到硬盘驱动器上的物理路径。您可以调整Web服务以接受特定路径或基本路径,如果没有提供,请使用Server.MapPath
找到它。
或者您可以创建一个接口抽象,比如说IPathMapper
,其中一个实现包装Server.MapPath
,另一个实现包装物理路径,并在同一个程序集中使用第二个。
我真的建议您在Web服务程序集中添加Web引用;后者将显着损害性能,更不用说使您的服务应用程序更难维护。
答案 1 :(得分:0)
是的,如果你想使用HTTP上下文,那么呼叫必须来自网络(通过你建议的网络参考)。
答案 2 :(得分:0)
是的,因为请求已经通过Web界面返回到解决方案中。