2010-04-17 100 views
0

我想做以下 我正在用c#語言編譯asp.net網站 我想從我的項目中讀取文本文件(該文件在項目中) 我試圖通過這種方式獲得文件路徑:ASP.net中的路徑問題

string path=Request.PhysicalApplicationPath+"filename.txt"; 

但我不能使用分離的C#文件中的「請求」對象? 注:分隔C3文件,我的意思是它不與aspx文件相關 你能幫我用我的方式還是你有另一種方式? thx

回答

2

我建議你從Web應用程序傳遞路徑到你的庫。因此,例如在你的web應用程序:

var path = Server.MapPath("~/filename.txt"); 
var result = BusinessLayer.SomeMethod(path); 

你也可以使用HostingEnvironment在你的類庫,但我真的建議你反對它,因爲它創建了System.Web的依賴,讓您的類庫綁在網頁上下文和沒有單元測試友好:

var path = Path.Combine(
    HostingEnvironment.ApplicationPhysicalPath, 
    "filename.txt" 
); 
+0

感謝達林 但我面臨同樣的問題 我不能使用「服務器」對象 從我的C#文件(這是我的基本問題) – Hany 2010-04-17 12:38:54

+0

我提供的第一個片段將被放置在Web應用程序,你在類庫中有Server對象和** not **。將路徑傳遞給類庫方法作爲參數,因此不需要計算它。 – 2010-04-17 12:41:47

+0

thx man 「HostingEnvironment.ApplicationPhysicalPath」 就是我正在尋找的 – Hany 2010-04-17 12:45:41

1

使用HttpContext.Current可以訪問請求,服務器響應和HTTP請求的其他對象。

+1

Blech!這也將使課程幾乎不可能測試。 – tvanfosson 2010-04-17 12:46:58

+0

@tvanfosson,我會說不可能:-) – 2010-04-17 12:47:49

1

但我不能使用分離的C#文件中的「請求」對象?

我猜你的意思是這是在一個DLL? 如果是這樣,那麼你可以通過在單獨的dll中引用system.web並獲取httpcontext.current對象來達到目的

0

我會使用某種注入機制來爲應用程序根路徑提供類或者可以使用的當前上下文/請求副本。從本質上講,您希望爲類提供查找路徑(或者甚至爲其提供路徑)的方法,而不是使用在測試中難以重新創建的固定依賴關係。爲了簡化我的示例,我將使用請求,但是,您可以很容易地將應用程序的基本路徑作爲字符串提供。

public class Foo 
{ 
    // HttpRequestBase may be more appropriate 
    private HttpRequest Request { get; set; } 

    public Foo(HttpRequest request) 
    { 
     this.Request = request; 
    } 

    public void Bar() 
    { 
      string path = Path.Combine(this.Request.PhysicalApplicationPath, 
             "filename.txt"); 
      ... 
    } 
} 

請注意,您可以將這與@ Darin關於如何計算服務器路徑的想法結合起來。