IIS搭建的http檔案伺服器

來源:互聯網
上載者:User

標籤:

使用C#WebClient類訪問(上傳/下載/刪除/列出檔案目錄)由IIS搭建的http檔案伺服器

前言

 

 為什麼要寫這邊博文呢?其實,就是使用C#WebClient類訪問由IIS搭建的http檔案伺服器的問題花了我足足兩天的時間,因此,有必要寫下自己所學到的,同時,也能讓廣大的博友學習學習一下。

 

本文足如有不足之處,請在下方留言提出,我會進行改正的,謝謝!

 

 

 

搭建IIS檔案伺服器

 

本博文使用的作業系統為Windows 10 企業版,其他Windows系統類別似,請借鑒:

 

一、當然,開始肯定沒有IIS,那該怎麼辦?需要一個軟體環境進行搭建,具體方法如下:

 

1)開啟“控制台”,找到“程式與功能”,如所示:

 

 

2)點進去之後,找到“啟用或關閉Windows功能”,如所示:

 

 

3)點進去之後,將“Internet Information Services”下所有節點都打勾(這樣就搭建了一個功能完全的HTTP/FTP伺服器),注意“WebDAV發布”必須要安裝,這個跟檔案伺服器中檔案存取權限有著很大的關係,如果想對伺服器中某個具有讀寫權限的檔案夾進行讀寫,就必須開啟該選項,如所示:

 

 

4)等待安裝完畢,請耐心等待, 如所示:

 

 

 

 

5)完成之後,點擊“關閉”按鈕即可,然後,開啟“控制台”,找到“管理工具”,如所示:

 

 

 

6)點擊“管理工具”後,找到“Internet Information Services (IIS)管理器”,開啟它,如所示:

 

 

 

7)進去之後,就已經進入了IIS的管理介面,我們只用到的功能為紅色框內的IIS功能,如所示:

 

 

8)第一搭建IIS,會出現一個預設的Web網站,我們將滑鼠移到“Default Web Site”上方,右鍵快顯功能表,在菜單中點擊“刪除”將該網站刪除,如所示:

 

 

 

9)添加自己的一個網站,滑鼠移到“網站”上方,右鍵點擊滑鼠,快顯功能表,在菜單中點擊“添加網站”,如所示:

 

 

10)根據如所說的步驟,填寫網站名稱及選擇實體路徑,其他預設即可,然後點擊“確定”按鈕:

 

 

 

11)本網站僅作為檔案伺服器,因此,將伺服器的檔案瀏覽功能開啟,以便瀏覽,具體操作為滑鼠雙擊“瀏覽目錄”後,將“操作”一欄裡的“啟用”開啟,如所示:

 

 

 

12)滑鼠雙擊“WebDAV創作規則”,如所示:

 

 

13)點擊“WebDAV設定”,如所示:

 

 

 

 

 

 

 14)將①②所示紅色框內的屬性設定為圖中所示的屬性,並點擊“應用”,如所示:

 

 

15)返回到“WebDAV創作規則”,點擊“添加創作規則”,如所示:

 

 

16)在彈出的“添加創作規則”,將“允許訪問此內容”選中,許可權“讀取、源、寫入”都打勾,點擊“確定”按鈕關閉,如所示:

 

 

 

 

 17)返回到“WebDAV創作規則”,點擊“啟用WebDAV”,如所示:

 

 

 

 

 18)雙擊“身分識別驗證”,將“匿名驗證”(用戶端讀取檔案)及“Windows身分識別驗證”(用戶端寫入、刪除)啟用,如下所示:

 

 

 

 

 

19)為了能讓檔案伺服器具有寫入、刪除功能,可以在現有Windows系統賬戶上建立一個隸屬於“Power Users”的賬戶“test”(密碼:123),如所示:

 

 

 

以上關於如何建立賬戶的內容,請自行百度

 

20)為了能讓test賬戶順利訪問存放於E盤下的“TestWebSite”檔案夾,需要為該檔案夾設定Power Users組的存取權限,如所示:

 

 

關於如何將特定組或使用者佈建許可權的問題,請自行百度

 

21)查看本機IIS的IP地址,並在瀏覽器輸入該IP,將會顯示以下內容,如所示:

 

 

 

22)自此,IIS檔案伺服器的搭建已經完畢。

 

 

 

使用C#WebClient訪問IIS檔案伺服器

 

 

 

本博文使用的的IDE為VS2015,在使用WebClient類之前,必須先引用System.Net命名空間,檔案下載、上傳與刪除的都是使用非同步編程,也可以使用同步編程,

 

這裡以非同步編程為例:

 

1)檔案下載:

 
 1         static void Main(string[] args) 2         { 3             //定義_webClient對象 4             WebClient _webClient = new WebClient(); 5             //使用預設的憑據——讀取的時候,只需預設憑據就可以 6             _webClient.Credentials = CredentialCache.DefaultCredentials; 7             //下載的連結地址(檔案伺服器) 8             Uri _uri = new Uri(@"http://192.168.1.103/test.doc"); 9             //註冊下載進度事件通知10             _webClient.DownloadProgressChanged += _webClient_DownloadProgressChanged;11             //註冊下載完成事件通知12             _webClient.DownloadFileCompleted += _webClient_DownloadFileCompleted;13             //非同步下載到D盤14             _webClient.DownloadFileAsync(_uri, @"D:\test.doc");15             Console.ReadKey();16         }17 18         //下載完成事件處理常式19         private static void _webClient_DownloadFileCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)20         {21             Console.WriteLine("Download Completed...");22         }23 24         //下載進度事件處理常式25         private static void _webClient_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)26         {27             Console.WriteLine($"{e.ProgressPercentage}:{e.BytesReceived}/{e.TotalBytesToReceive}");   28         }
 

運行結果如下:

 

 

2)檔案上傳:

 
        static void Main(string[] args)        {            //定義_webClient對象            WebClient _webClient = new WebClient();            //使用Windows登入方式            _webClient.Credentials = new NetworkCredential("test", "123");            //上傳的連結地址(檔案伺服器)            Uri _uri = new Uri(@"http://192.168.1.103/test.doc");            //註冊上傳進度事件通知            _webClient.UploadProgressChanged += _webClient_UploadProgressChanged;            //註冊上傳完成事件通知            _webClient.UploadFileCompleted += _webClient_UploadFileCompleted;            //非同步從D盤上傳檔案到伺服器            _webClient.UploadFileAsync(_uri,"PUT", @"D:\test.doc");            Console.ReadKey();        }        //下載完成事件處理常式        private static void _webClient_UploadFileCompleted(object sender, UploadFileCompletedEventArgs e)        {            Console.WriteLine("Upload Completed...");        }        //下載進度事件處理常式        private static void _webClient_UploadProgressChanged(object sender, UploadProgressChangedEventArgs e)        {            Console.WriteLine($"{e.ProgressPercentage}:{e.BytesSent}/{e.TotalBytesToSend}");        }
 

運行結果如下:

 

 

3)檔案刪除:

 
        static void Main(string[] args)        {            //定義_webClient對象            WebClient _webClient = new WebClient();            //使用Windows登入方式            _webClient.Credentials = new NetworkCredential("test", "123");            //待刪除的檔案連結地址(檔案伺服器)            Uri _uri = new Uri(@"http://192.168.1.103/test.doc");            //註冊刪除完成時的事件(類比刪除)            _webClient.UploadDataCompleted += _webClient_UploadDataCompleted;            //非同步從檔案(類比)刪除檔案            _webClient.UploadDataAsync(_uri, "DELETE", new byte[0]);            Console.ReadKey();        }        //刪除完成事件處理常式        private static void _webClient_UploadDataCompleted(object sender, UploadDataCompletedEventArgs e)        {            Console.WriteLine("Deleted...");        }
 

運行結果如下:

 

 

4)列出檔案(或目錄):

 

 需引入命名空間:System.IO、System.Xml及System.Globalization

 
        static void Main(string[] args)        {            SortedList<string, ServerFileAttributes> _results =GetContents(@"http://192.168.1.103", true);            //在控制台輸出檔案(或目錄)資訊:            foreach(var _r in _results)            {                Console.WriteLine($"{_r.Key}:\r\nName:{_r.Value.Name}\r\nIsFolder:{_r.Value.IsFolder}");                Console.WriteLine($"Value:{_r.Value.Url}\r\nLastModified:{_r.Value.LastModified}");                Console.WriteLine();            }            Console.ReadKey();        }        //定義每個檔案或目錄的屬性        struct ServerFileAttributes        {            public string Name;            public bool IsFolder;            public string Url;            public DateTime LastModified;        }        //將檔案或目錄列出來        static SortedList<string, ServerFileAttributes> GetContents(string serverUrl, bool deep)        {            HttpWebRequest _httpWebRequest = (HttpWebRequest)HttpWebRequest.Create(serverUrl);            _httpWebRequest.Headers.Add("Translate: f");            _httpWebRequest.Credentials = CredentialCache.DefaultCredentials;            string _requestString = @"<?xml version=""1.0"" encoding=""utf-8""?>" +                  @"<a:propfind xmlns:a=""DAV:"">" +                  "<a:prop>" +                  "<a:displayname/>" +                  "<a:iscollection/>" +                  "<a:getlastmodified/>" +                  "</a:prop>" +                  "</a:propfind>";            _httpWebRequest.Method = "PROPFIND";            if (deep == true)                _httpWebRequest.Headers.Add("Depth: infinity");            else                _httpWebRequest.Headers.Add("Depth: 1");            _httpWebRequest.ContentLength = _requestString.Length;            _httpWebRequest.ContentType = "text/xml";            Stream _requestStream = _httpWebRequest.GetRequestStream();            _requestStream.Write(Encoding.ASCII.GetBytes(_requestString), 0, Encoding.ASCII.GetBytes(_requestString).Length);            _requestStream.Close();            HttpWebResponse _httpWebResponse;            StreamReader _streamReader;            try            {                _httpWebResponse = (HttpWebResponse)_httpWebRequest.GetResponse();                _streamReader = new StreamReader(_httpWebResponse.GetResponseStream());            }            catch (WebException ex)            {                throw ex;            }            StringBuilder _stringBuilder = new StringBuilder();            char[] _chars = new char[1024];            int _bytesRead = 0;            _bytesRead = _streamReader.Read(_chars, 0, 1024);            while (_bytesRead > 0)            {                _stringBuilder.Append(_chars, 0, _bytesRead);                _bytesRead = _streamReader.Read(_chars, 0, 1024);            }            _streamReader.Close();            XmlDocument _xmlDocument = new XmlDocument();            _xmlDocument.LoadXml(_stringBuilder.ToString());            XmlNamespaceManager _xmlNamespaceManager = new XmlNamespaceManager(_xmlDocument.NameTable);            _xmlNamespaceManager.AddNamespace("a", "DAV:");            XmlNodeList _nameList = _xmlDocument.SelectNodes("//a:prop/a:displayname", _xmlNamespaceManager);            XmlNodeList _isFolderList = _xmlDocument.SelectNodes("//a:prop/a:iscollection", _xmlNamespaceManager);            XmlNodeList _lastModifyList = _xmlDocument.SelectNodes("//a:prop/a:getlastmodified", _xmlNamespaceManager);            XmlNodeList _hrefList = _xmlDocument.SelectNodes("//a:href", _xmlNamespaceManager);            SortedList<string, ServerFileAttributes> _sortedListResult = new SortedList<string, ServerFileAttributes>();            ServerFileAttributes _serverFileAttributes;            for (int i = 0; i < _nameList.Count; i++)            {                if (_hrefList[i].InnerText.ToLower(new CultureInfo("en-US")).TrimEnd(new char[] { ‘/‘ }) != serverUrl.ToLower(new CultureInfo("en-US")).TrimEnd(new char[] { ‘/‘ }))                {                    _serverFileAttributes = new ServerFileAttributes();                    _serverFileAttributes.Name = _nameList[i].InnerText;                    _serverFileAttributes.IsFolder = Convert.ToBoolean(Convert.ToInt32(_isFolderList[i].InnerText));                    _serverFileAttributes.Url = _hrefList[i].InnerText;                    _serverFileAttributes.LastModified = Convert.ToDateTime(_lastModifyList[i].InnerText);                    _sortedListResult.Add(_serverFileAttributes.Url, _serverFileAttributes);                }            }            return _sortedListResult;        }
 

 

 

運行結果如下:

 

IIS搭建的http檔案伺服器

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.