2010年12月7日

如何在ASP.NET網站讀取不同主機的檔案-網路芳鄰方式

企業裡可能會把電子檔案集中在一個file server裡, 如果有一web server的機器,  但跟file server是不同機器, 這時便產生了兩台主機傳輸檔案的問題, 透過網路芳鄰是個解法,但會涉及一些權限的設定。
我們將設計一個下載網頁, 點download鍵, 將會透過web server, 經由網路芳鄰去file server的c:\remote_files, 將AA.txt下載, 操作如下圖。

image 

以下是整個實作的步驟:

設定web server

1. web server 建一帳號IUSER_REMOTE, 設定密碼1234
  • 只打勾”密碼永遠有效”
image
2.  進入IIS-應用程式虛擬目錄-目錄安全設定
  • uncheck 允許IIS來控制密碼,
  • 使用者/密碼, 改為IUSER_REMOTE/1234
image

設定File server

1. 建一帳號IUSER_REMOTE, 設定密碼1234
  • 只打勾”密碼永遠有效”
2. 到你要存取的目錄, 像是c:\remote_files,
  • 設定共用
  • 使用權限給IUSER_REMOTE讀寫的權限
image


回到Web Server設定Web.config

1. 到你的web目錄下, 打開web.coonfig, system.web裡加入identity標籤並設定impersonate為true

<system.web>
<identity impersonate="true"/>
</system.web>
但以上適用在"IIS驗證帳號"而已
2. 我們設定了新帳號, 要用以下的指令

<system.web>
<identity impersonate="true" userName="IUSER_REMOTE" password="1234" />
</system.web>
3. 修改WEB 主機目錄權限
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files
賦與IUSER_REMOTE讀寫權限


開始進行程式

    在寫程式之前要先了解UNC(Universal Naming Convention) 的路逕, 是像這樣\\Fileserver\FolderName\Files\File1.txt, 也就是網路芳鄰上的打法 ,另外在coding 前先了解asp.net 幾種檔案下載方式比較 , 這裡我們使用HttpResponse.WriteFile , 因為它支援UNC路徑, 以下是範例程式:
protected void Button1_Click(object sender, EventArgs e)
{
string fileNmae ;
fileNmae = @"\\192.168.1.1\remote_files\aa.txt";
if (System.IO.File.Exists(fileNmae.Trim()))
{
Response.Write(fileNmae);
Send(Context, fileNmae);

}

}
public static void Send(HttpContext context, string fileName)
{

HttpResponse response = context.Response;
HttpCookie cookie = context.Request.Cookies["downloadstatus"];
if (cookie == null)
{
cookie = new HttpCookie("downloadstatus", String.Empty);
}
HttpCookie errorCookie = new HttpCookie("downloaderror", string.Empty);
FileInfo TheFile = new FileInfo(fileName);


if (TheFile.Exists) 
{
//將檔案下載--
response.Clear();

cookie.Value = "success";

response.SetCookie(cookie); //寫入cookie
response.Buffer = true;
response.AddHeader("content-disposition", "attachment;filename=" + TheFile.Name);//檔頭

response.Charset = "";
response.ContentType = GetContentType(TheFile.Name);//取得Content Type

response.WriteFile(TheFile.FullName, false);//輸出檔案
response.Flush();
response.End();
//--------------
}
else
{

//將cookie設為錯誤
cookie.Value = "fail";
errorCookie.Value = "File " + TheFile.Name + " doesn't exists on the server";
response.SetCookie(cookie);
response.SetCookie(errorCookie);
}

}
//取得Content Type
public static string GetContentType(string fileName)
{
string contentType = "application/octetstream";
string ext = System.IO.Path.GetExtension(fileName).ToLower();
Microsoft.Win32.RegistryKey registryKey = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(ext);
if (registryKey != null && registryKey.GetValue("Content Type") != null)
contentType = registryKey.GetValue("Content Type").ToString();
return contentType;
}

後記


一般企業防火牆可能會關畢網路芳鄰的port 445, 在建置時要請網管打開。以上的範例是沒在AD下, 如果在AD下, 則帳號設定在AD上。

參考資訊:


http://support.microsoft.com/kb/306158

http://blog.miniasp.com/post/2007/11/10/How-to-write-file-to-net-share-folder-using-ASPNET.aspx

沒有留言:

張貼留言