WebClient服务不能停止

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WebClient服务不能停止相关的知识,希望对你有一定的参考价值。

我的电脑装的XP SP2,最近因为要用到webdav,发现不正常,就试着把相关服务WebClient服务停止,却发现不能停止,在系统事件日志里发现新的错误:等待来自 WebClient 服务的事务处理响应超时(30000 毫秒)。事件ID:7011
但是重启电脑,服务显示是已经启动,但在属性里就是没法停止,是否是webdav转向器出了问题呢?

你可以进控制面版,点击管理工具,选择服务,进去后把WebClient 服务停止,然后把启动类型改成禁止,不过WebClient 服务是基于 Windows 的程序能创建、访问和修改基于 Internet 的文件。如果此服务被终止,将会失去这些功能。如果此服务被禁用,任何依赖它的服务将无法启动。最好修复安装一下 参考技术A 将服务的启动方式改成手动试试.

WebClient 系统服务允许 Win32 应用程序访问 Internet 中的文档。WebClient 允许标准的 Win32 应用程序使用 WebDAV 协议来创建和读写 Internet 文件服务器中的文件,从而扩展了 Windows 的网络功能。WebDAV 协议是一种通过 XML 描述的文件访问协议,它可通过超文本传输协议 (HTTP) 传输。如果使用标准的 HTTP,WebDAV 可在现有 Internet 基础结构上运行:例如防火墙和路由器。

如果停止 WebClient 服务,系统将阻止您使用 Web 发布向导将数据发布到使用 WebDAV 协议的 Internet 位置。如果禁用该服务,所有明显依赖于该服务的服务都将无法启动。

WebClient 从服务器下载/获取文件方式

  今天主要记录、分享 使用WebClient 下载/获取 文件的两种方式。  

  话不多说,放置代码。

  第一种:使用 WebClient 自封装方法: DownloadFile();  下载方便、直接。

        /// <summary>
        /// 下载文件(WebClient.DownloadFile)
        /// </summary>
        /// <param name="downFileUrl">下载文件链接地址</param>
        /// <param name="savePath">保存路径</param>
        /// <returns></returns>
        public static string DownLoadFileByWebClientStatic(string downFileUrl, string savePath)
        {
            string result = string.Empty;
            try
            {
                WebClient wcClient = new WebClient();
                wcClient.DownloadFile(downFileUrl, savePath);
                result = "下载成功";
            }
            catch (WebException ex)
            {
                result = $"下载失败!Error={ ex.Message}";
            }
            return result;
        }

        /// <summary>
        /// 下载文件(wcClient.DownloadFileAsync)
        /// </summary>
        /// <param name="downFileUrl">下载文件链接地址</param>
        /// <param name="savePath">保存路径</param>
        /// <returns></returns>
        public static string DownLoadFileMethod(string downFileUrl, string savePath)
        {
            string result = string.Empty;
            try
            {
                WebClient wcClient = new WebClient();
                wcClient.DownloadDataCompleted += (t, s) =>
                {
                    result = "下载成功";//不会直接返回(无状态?)
                };
                wcClient.DownloadFileAsync(new Uri(downFileUrl), savePath);
            }
            catch (WebException ex)
            {
                result = $"下载失败!Error={ ex.Message}";
            }
            return result;
        }

  第二种:使用读取文件流形式下载/获取文件。(自测通过)

     /// <summary>
        /// 下载文件(Stream 形式处理)
        /// </summary>
        /// <param name="downFileUrl">下载文件链接地址</param>
        /// <param name="savePath">保存路径</param>
        /// <returns></returns>
        public static string DownLoadFileByWebClient(string downFileUrl, string savePath)
        {
            string result = string.Empty;
            try
            {
                WebClient wcClient = new WebClient();

                WebRequest webReq = WebRequest.Create(downFileUrl);
                WebResponse webRes = webReq.GetResponse();
                long fileLength = webRes.ContentLength;
                Stream srm = webRes.GetResponseStream();
                StreamReader srmReader = new StreamReader(srm);

                byte[] bufferbyte = new byte[fileLength];
                int allByte = (int)bufferbyte.Length;
                int startByte = 0;
                while (fileLength > 0)
                {
                    int downByte = srm.Read(bufferbyte, startByte, allByte);
                    if (downByte == 0) break;
                    startByte += downByte;
                    allByte -= downByte;
                }
                //检测保存文件所在目录是否存在
                if (!File.Exists(savePath))
                {
                    string[] dirArray = savePath.Split(\);
                    string temp = string.Empty;
                    for (int i = 0; i < dirArray.Length - 1; i++)
                    {
                        temp += dirArray[i].Trim() + "\";
                        if (!Directory.Exists(temp))
                            Directory.CreateDirectory(temp);
                    }
                }

                using (FileStream fsSave = new FileStream(savePath, FileMode.OpenOrCreate, FileAccess.Write))
                {
                    fsSave.Write(bufferbyte, 0, bufferbyte.Length);
                    fsSave.Dispose();
                }
                
                //与using 方法两者等同。
                //FileStream fs = new FileStream(savePath, FileMode.OpenOrCreate, FileAccess.Write);
                //fs.Write(bufferbyte, 0, bufferbyte.Length);
                srm.Close();
                srmReader.Close();
                //fs.Close();

                result = $"下载成功 path={savePath}";
            }
            catch (WebException ex)
            {
                result = $"下载失败!Error={ ex.Message}";
            }
            return result;
        }
        

     第二种 通过文件流 下载,方法分支:(使用WebClient 的 OpenRead() 方式获取到Stream ,然后进行文件流读取,不知为何,自测失败,下载的文件无法正常打开)。 现在还没有找到合理解释,希望大家评论。    

 /// <summary>
        /// 下载文件
        /// </summary>
        /// <param name="URLAddress">资源URL</param>
        /// <param name="saveBasePath">保存根目录/目录</param>
        /// <returns></returns>
        public string DownFileByStream(string URLAddress, string saveBasePath)
        {
            string result = string.Empty;
            try
            {
                WebClient client = new WebClient();
                Stream str = client.OpenRead(URLAddress);
                StreamReader reader = new StreamReader(str);

                byte[] bytes = new byte[1024 * 1024];//自定义大小 1M
                int allybytes = (int)bytes.Length;
                int startbytes = 0;

                while (allybytes > 0)
                {
                    int m = str.Read(bytes, startbytes, allybytes);  //获取当前读取字节位置
                    if (m == 0)
                        break;
                    startbytes += m;
                    allybytes -= m;
                }

                reader.Dispose();
                str.Dispose();
                
                string path = saveBasePath + System.IO.Path.GetFileName(URLAddress);
                FileStream fsWrite = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write);
                fsWrite.Write(bytes, 0, startbytes);
                fsWrite.Flush();
                fsWrite.Close();

                result = "下载成功!";
            }
            catch (Exception ex)
            {
                result = "下载失败!" + ex.Message;
            }
            return result;
        }

    如有不合理之处,欢迎指出。以上就是今天的记录;本文大部分内容都可以搜到,只是此处做了一个小整理。

    如果您觉得本文对您有帮助,欢迎点击“收藏”按钮!(/:微笑)欢迎转载,转载请注明出处。

 

以上是关于WebClient服务不能停止的主要内容,如果未能解决你的问题,请参考以下文章

使用 WebClient 从 Windows 服务访问网络共享

[C#]使用WebClient上传文件并同时Post表单数据字段到服务端

无法从 C# Rest 服务获取 WebClient.UploadFile

webclient基础连接已经关闭,无法连接到远程服务器

WebClient 从服务器下载/获取文件方式

使用 SpringFlux 的 webclient 重复 Mono