ASP.NET訪問網絡映射盤&實現文件上傳讀取功能


     最近在改Web的時候,遇到一個問題,要跨機器訪問共享文件夾,以實現文件正常上傳下載功能。

     要實現該功能,可以采用HTTP的方式,也可以使用網絡映射磁盤的方式,今天主要給大家分享一下使用網絡映射磁盤的方式,來跨機器訪問共享文件夾。

 

     解決方案:

   本以為只要在Web服務器做一下磁盤映射,然后把該映射盤符當做本地磁盤來使用就可以了,但是卻一直有問題,查找了一下資料,是因為IIS默認賬戶為NETWORK_SERVICE,該賬戶是沒權限訪問共享目錄的,所以當我們把站點部署到IIS上的時候,再訪問映射磁盤就會報“找不到路徑”的錯誤。所以,直接創建磁盤映射是行不通的,我們需要在程序中用指定賬戶創建映射,並用該賬戶運行IIS進程,下面來說下詳細步驟及相關代碼。

 

     詳細步驟:

     (注:A服務器為ASP.NET程序所在服務器,B服務器為共享文件夾所在服務器)

   1、在A、B兩台服務器上面創建相同用戶名、密碼的賬戶,如:賬戶為user1,密碼為pwd1;

          A服務器user1賬戶的用戶組選擇默認的user組即可;

          B服務器user1賬戶需移出所有用戶組;

     2、在B服務器中創建共享文件夾Image,並設置訪問賬戶為user1;

     3、WEB項目中新建公共類WNetHelper 

 1 using System.Runtime.InteropServices;
 2  
 3 public class WNetHelper
 4 {
 5     [DllImport("mpr.dll", EntryPoint = "WNetAddConnection2")]
 6     private static extern uint WNetAddConnection2(NetResource lpNetResource, string lpPassword, string lpUsername, uint dwFlags);
 7  
 8     [DllImport("Mpr.dll", EntryPoint = "WNetCancelConnection2")]
 9     private static extern uint WNetCancelConnection2(string lpName, uint dwFlags, bool fForce);
10  
11     [StructLayout(LayoutKind.Sequential)]
12     public class NetResource
13     {
14         public int dwScope;
15  
16         public int dwType;
17  
18         public int dwDisplayType;
19  
20         public int dwUsage;
21  
22         public string lpLocalName;
23  
24         public string lpRemoteName;
25  
26         public string lpComment;
27  
28         public string lpProvider;
29     }
30  
31     /// <summary>
32     /// 為網絡共享做本地映射
33    /// </summary>
34     /// <param name="username">訪問用戶名(windows系統需要加計算機名,如:comp-1\user-1)</param>
35     /// <param name="password">訪問用戶密碼</param>
36     /// <param name="remoteName">網絡共享路徑(如:\\192.168.0.9\share)</param>
37     /// <param name="localName">本地映射盤符</param>
38     /// <returns></returns>
39     public static uint WNetAddConnection(string username, string password, string remoteName, string localName)
40     {
41         NetResource netResource = new NetResource();
42  
43         netResource.dwScope = 2;
44         netResource.dwType = 1;
45         netResource.dwDisplayType = 3;
46         netResource.dwUsage = 1;
47         netResource.lpLocalName = localName;
48         netResource.lpRemoteName = remoteName.TrimEnd('\\');
49         uint result = WNetAddConnection2(netResource, password, username, 0);
50  
51         return result;
52     }
53  
54     public static uint WNetCancelConnection(string name, uint flags, bool force)
55     {
56         uint nret = WNetCancelConnection2(name, flags, force);
57  
58         return nret;
59     }
60 }
View Code

     4、為IIS指定運行賬戶user1

          在Web.config的<system.web>下添加<identity impersonate="true" userName="user1" password="pwd1"/>;

     5、在訪問共享目錄前,調用WNetHelper.WNetAddConnection,添加磁盤映射

 1 uint state = 0;
 2 if (!Directory.Exists("Z:"))
 3 {
 4     state = WNetHelper.WNetAddConnection(@"user1", "pwd1", @"\\192.168.1.196\Image", "Z:");
 5 }
 6 if (state.Equals(0))
 7 {
 8     //創建共享目錄的上傳路徑
 9     if (!Directory.Exists("Z:\\UpLoad"))
10     {
11         Directory.CreateDirectory("Z:\\UpLoad"));
12     }
13 }
14 else
15 {
16     WriteLog("添加網絡驅動器錯誤,錯誤號:" + state.ToString());
17 }
View Code

     6、實現上傳讀取功能
          上傳:

          file1.SaveAs(@"Z:\UpLoad\2016-01-26_124937.png");

          讀取:

     新建一個ashx文件:Attachment.ashx

          byte[] datas = System.IO.File.ReadAllBytes("\\192.168.1.198\Image\UpLoad\2016-01-26_124937.png");       
          context.Response.OutputStream.Write(datas, 0, datas.Length);

          后台:

          imgView.ImageUrl = "Attachment.ashx";

 

     還有一種比較簡單的方式來訪問共享文件,它不需要映射磁盤

     在Global.asax的Application_Start()中添加下面的代碼即可

 1 void Application_Start(object sender, EventArgs e) 
 2 {
 3     // 應用程序啟動時執行的程序代碼
 4     string strUser = "user1";
 5     string strPwd = "pwd1";
 6     string strMapUrl = @"\\192.168.1.198\Image";
 7     
 8     System.Diagnostics.ProcessStartInfo p = new System.Diagnostics.ProcessStartInfo("net.exe"
 9         , "use " + strMapUrl + " \"" + strPwd + "\" /user:\"" + strUser + "\"");
10     p.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
11     System.Diagnostics.Process.Start(p);
12 }

     然后在程式里面就可以直接用\\192.168.1.198\Image來取.

     參考文章:http://www.cnblogs.com/sqzhuyi/archive/2011/01/15/aspnet-remote.html

                   http://www.cnblogs.com/sunyanjun/articles/2419399.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM