【问题标题】:Calling WebService From Same Project从同一个项目调用 WebService
【发布时间】:2010-04-19 13:21:41
【问题描述】:

我正在尝试从它所在的同一个项目中调用一个 asp.net 网络服务:

[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 请求的上下文中使用。”: p>

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 或者我可以使用 HttpRuntime.AppDomainAppPath,很好地获取基本目录
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2017-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-30
        • 2018-02-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多