从同一个项目调用WebService

时间:2010-04-19 13:21:42

标签: c# asp.net web-services server.mappath

我正在尝试从它所在的同一个项目调用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在同一个项目中?

3 个答案:

答案 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界面返回到解决方案中。