IIS搭建的http文件服务器

使用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;
        }

运行结果如下:

时间: 2024-10-01 23:52:35

IIS搭建的http文件服务器的相关文章

使用C#WebClient类访问(上传/下载/删除/列出文件目录)由IIS搭建的http文件服务器

前言 为什么要写这边博文呢?其实,就是使用C#WebClient类访问由IIS搭建的http文件服务器的问题花了我足足两天的时间,因此,有必要写下自己所学到的,同时,也能让广大的博友学习学习一下. 本文足如有不足之处,请在下方留言提出,我会进行改正的,谢谢! 搭建IIS文件服务器 本博文使用的操作系统为Windows 10 企业版,其他Windows系统类似,请借鉴: 一.当然,开始肯定没有IIS,那该怎么办?需要一个软件环境进行搭建,具体方法如下: 1)打开“控制面板”,找到“程序与功能”,如

IIS搭建本地服务器,花生壳实现外网通过域名访问网站

配置服务器 作为一个青年,没有实力,做不出标图所示的服务器. 作为一个学生,买不起服务器 作为一个小孩,买不起域名 但别忘了 作为一个平民玩家,只要有耐心 装备迟早会做出来的 (注:感觉有钱与没钱还是区别好大) 一.涉及内容 目的: 1.搭建本地服务器   2.让外网用户能够访问本地   3.获得免费域名  4.使用域名访问 内容:  1.使用花生壳和IIS配置本地服务器 2.参考(相关)网址 大致步骤: 1.ISS的启动 2.网站的添加 3.ISS中IP的选择 4.花生壳的使用 注:本文演示的

Nginx 在windows下配合iis搭建负载均衡过程 [转]

因为项目遇到大量图片存储问题,虽然现在我们图片还不是很多(目前在1T上下,预计增长速度每年1.3倍的增长速度),自己在思考如何有效地存储大量图片时,查找一些资料,看到了,有人使用 Nginx搭建服务器,本着学习的目的,自己也亲自去体验了一下nginx在window下的安装过程,并配合iis搭建一个负载均衡的过程,环境如下: 解释一下,因为我自己就一台计算机,为了演示效果,所以安装了虚拟机. 计算机A : 本计算机上安装Nginx 同时也会配置IIS,为了不和Nginx的80端口冲突,务必要修改端

【已解决】IIS搭建 asp.net core 项目后 其他电脑访问不到资源文件

IIS搭建asp.net core 项目后,访问不到里面的资源文件(图片等),解决方法如下: 1.检查asp.net core发布文件中的资源文件是不是都放到了wwwroot名称的目录中. 2.检查asp.net core项目内Startup.cs文件中加上了app.UseStaticFiles(); 检查以上两点后 然后访问就可以找到资源了. ps 访问资源的链接中不用加 wwwroot. 原文地址:https://www.cnblogs.com/YangPeng/p/8971374.html

IIS 搭建过程

  Windows自带iis管理器,也就是这个 <ignore_js_op> 我们可以用它来搭建一个网站,然后在局域网内可随意访问我们的电脑. 1.首先,iis的安装. 虽然说是windows自带,可是默认是未安装的 1)首先进入控制面板里的程序与功能 <ignore_js_op> 2)点击红框,然后找到图内所示 <ignore_js_op> 3)点击最上层的即可然后点击确定进行安装.安装速度取决于网速. 4)安装完毕以后就可以在控制面板里的管理工具里面找到iis管理器

Windows 2008 R2 IIS搭建 FTP及FTP不能访问笔记

FTP 搭建, 1.1开始--管理工具--服务器管理器,见下图 1.2选择角色--添加角色--下一步 1.3选择web服务器(IIS) 1.4选中FTP服务器 1.5按提示现在下一步,直到提示安装成功,后关闭界面 1.6增加ftp用户,并建立ftp文件夹,将ftp用户设置权限 1.7建立ftp文件夹,将ftp用户设置权限 1.8打开IIS,点击站点右键选择添加ftp站点,按下图操作 1.9按下图配置 1.10 ftp按下图配置 1.11 ftp按下图配置 1.12 FTP配置好后,ftp不能登录

从零开始,在windows上用nodejs搭建一个静态文件服务器

首先安装nodejs: 新建一个node文件夹 下载node.exe到该文件夹 下载npm然后解压到该文件夹 现在node文件夹是这样的 把该目录加入到path环境变量 在命令行执行 node -v npm -v 如果得到了版本号则表示nodejs安装完成 在命令行中执行 npm config set registry https://registry.npm.taobao.org 以后安装nodejs模块 都会从淘宝的npm镜像中下载 如果想要发布自己的模块到npm要先把npm的registr

iis搭建FTP服务器

win7下如何开启iis请参考前一篇 使用iis并搭建 iis 图片服务器 ftp登陆格式  : ftp://[帐号]:[密码]@[IP]:[端口] ftp://用户名:密码@FTP服务器IP或域名:FTP命令端口/路径/文件名 1.进入iis管理器 网站右键选择添加ftp站点 2.输入名称及选择物理路径 3.选择ip及端口(默认21),勾选自动启动,允许ssl 4.选择身份验证,需要用户名密码的选择基本,不允许匿名访问 授权可以选择用户,一般所有用户 权限可以根据需要读取和写入 点击完成即可.

利用iis虚拟目录实现文件服务器功能(分布式存储)

要求说明: 通过网站上传文件保存到统一的文件服务器上. 服务器说明: 1.文件服务器以下称为FilesServer,IP地址为:192.168.1.213 2.Web服务器为以下称为WebServer,IP地址为:192.168.1.214 详细步骤: (1)在FilesServer和WebServer上分别新建一个新用户,要求这两个用户的用户名和密码均相同,具体创建过程不再赘述.列如我创建的用户名是File_Share,密码为Share123 (2)在FilesServer上建立一个文件夹用来