2010-04-19 61 views
1

我試圖調用從同一項目是在一個asp.net web服務:調用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; 

我一定要添加Web引用,而不是,雖然Web服務是在同一個項目?

回答

1

而不是完全依賴於您的Web服務中的HttpContext(通常不是一個好習慣),您應該爲WebService類添加一個參數化的構造函數。然後,在默認的無參數構造函數中,您可以檢查HttpContext以獲得相同的依賴關係。

這樣,當您需要從同一個程序集調用Web服務時,您可以在進程中共享依賴關係,而不必依賴於HttpContext

在這種情況下,您的依賴關係是Server.MapPath,它將URL中的相對路徑映射到硬盤上的物理路徑。您可以調整您的Web服務以接受特定路徑或基本路徑,如果沒有提供,請使用Server.MapPath來查找它。

或者你也可以創建一個接口抽象,比如說IPathMapper,其中一個實現包裝了Server.MapPath,另一個包裝物理路徑,並且使用同一個程序集中的第二個。

我真的會推薦這通過從您的Web服務程序集中添加Web引用;後者是要去明顯傷害的表現,更不用說讓你的服務應用程序更難以維護。

+0

或者我可以用戶HttpRuntime.AppDomainAppPath,很好地獲得基地目錄 – 2010-04-19 13:49:35

0

是的,如果你想使用HTTP上下文,這個調用必須從網上進來(通過你建議的web引用)。

0

是的,因爲請求正在通過Web界面返回到解決方案中。