1

我试图从它所在的同一个项目中调用一个 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");

}

但是,当从 web 服务调用 Server.MapPath 时,我总是得到以下“ HttpContext 不可用。此类只能在 ASP.NET 请求的上下文中使用。

[WebMethod]
public int Analyse(string fileName, string PARSING_MODULE){

    int nRecords;
    TrackSession rTrackSession = new TrackSession() ;
    string filePath = Server.MapPath(@"..\data\") + fileName;

尽管 web 服务在同一个项目中,但我是否必须添加 WebReference?

4

3 回答 3

1

您应该向您的类添加一个参数化的构造函数,而不是完全依赖HttpContext于您的 Web 服务(通常不是一个好的做法)WebService。然后,在默认的无参数构造函数中,您可以检查HttpContext相同的依赖项。

这样,当您需要从同一个程序集调用 Web 服务时,您可以在进程内共享依赖项,而不是依赖于HttpContext.

在这种情况下,您的依赖项是Server.MapPath,它将 URL 中的相对路径映射到硬盘驱动器上的物理路径。您可以调整您的 Web 服务以接受特定路径或基本路径,如果没有提供,请使用Server.MapPath它来定位它。

或者,您可以创建一个接口抽象,例如IPathMapper,使用一个封装的实现Server.MapPath和另一个仅封装物理路径的实现,并在同一个程序集中使用第二个实现。

我真的建议这样做,而不是从您的 Web 服务程序集中添加 Web 引用;后者会严重影响性能,更不用说让你的服务应用程序更难维护了。

于 2010-04-19T13:36:06.593 回答
0

是的,如果您想使用 HTTP 上下文,则调用必须来自网络(通过您建议的网络参考)。

于 2010-04-19T13:23:52.457 回答
0

是的,因为请求会通过 Web 界面传出并返回到解决方案中。

于 2010-04-19T13:24:23.007 回答