桌面应用也可以提供HTTP文件下载
以往,我们肯定知道,在搞Web应用的时候,我们都可能会遇到提供文件下载的功能需求,比如我以前做的一个客户许可证管理系统,客户购买ERP系统后,通常我们会根据客户的机器的机器码生成一个许可文件,而这个许可文件是有时间限制的,一年后会过期,过期之后客户需要重新获取许可,以表示继续使用我们的超级牛B产品,如果客户不再获取许可,就表明客户不再使用我们的超级牛B产品。
后来一想,是啊,倒不如咱们弄个Web程序,让客户自行登入,输入机器码后,自动生成许可文件,然后客户在页面上点击下载就行了。提供下载功能其实很常见,像许多软件下载站等。
不过,我们是否考虑过,如果我们编写一个仅仅提供HTTP下载相关的少数功能的应用程序,我们似乎没有必要大动干戈在机器上弄个服务器搞个Web站点。通常这种情况,做个小小的窗口程序就可以完事了。所以,就会想到使用桌面应用程序来提供HTTP下载这想法了。
其实,这个实现起来并不复杂,System.Net命名空间下提供了一个HttpListener类,它可监听客户端传入的HTTP请求,然后返回一个HttpListenerContext对象,再通过HttpListenerContext对象可以得到用于处理请求/响应有关的对象。
根据这个思路,我们也可以轻松做到提供下载功能,原来和Web方式是一样的,就是在响应请求时插入Content-Disposition标头,值为attachment;filename=<文件名>的方法就能实现。
- private async void btnListen_Click(object sender, EventArgs e)
- {
- HttpListener listener = new HttpListener();
- listener.Prefixes.Add("http://+:80/download/");
- listener.Start();
- btnListen.Enabled = false;
- HttpListenerContext context = await listener.GetContextAsync();
- if (context != null)
- {
- // 添加Content-Disposition标头
- context.Response.AppendHeader("Content-Disposition", "attachment;filename=" + WebUtility.UrlEncode( Path.GetFileName(lblFilePath.Text)));
- try
- {
- using (FileStream stream = File.OpenRead(lblFilePath.Text))
- {
- // 添加内容说明符
- context.Response.ContentType = MediaTypeNames.Application.Octet;
- // 内容长度
- context.Response.ContentLength64 = stream.Length;
- // 回发数据给客户端
- byte[] buffer = new byte[1024];
- int n = stream.Read(buffer, 0, buffer.Length);
- while (n > 0)
- {
- context.Response.OutputStream.Write(buffer, 0, n);
- n = stream.Read(buffer, 0, buffer.Length);
- }
- context.Response.Close(); //关闭
- }
- }
- catch(Exception ex)
- {
- MessageBox.Show(ex.Message);
- }
- }
- listener.Stop(); //停止监听
- btnListen.Enabled = true;
- }
在设置filename时将文件名加上WebUtility.UrlEncode进行编码是防止当文件名中包含中文时呈现乱码。
而发送文件给客户端就简单多了,和普通的流操作没有区别,把从文件中读到的数据写入Response.OutputStream流中即可,发送完毕后,调用Close方法关闭HttpListenerResponse对象,因此处理已经完成,没有必再开着它占用资源。
监听地址为http://+:80/download/,表示HttpListener将监在80端口上的所有主机名接收到的请求,后面的路径中加上 download/ 只是为了不与IIS的默认localhost地址冲突,因为我开启了IIS。
运行后,选择一个文件,然后点击按钮开始监听。
随后在浏览器中输入 http://localhost/download/ ,按回车,就可以测试下载了。
桌面应用也可以提供HTTP文件下载的更多相关文章
- Windows Server 2012 没有远程桌面授权服务器可以提供许可证,远程会话被中断
今天在登录公司内部的服务器的时候,无法进行远程访问. 弹出错误信息:没有远程桌面授权服务器可以提供许可证,远程会话被中断 经过网上的寻找,原来是server 2012 远程登录只提供120天的使用期限 ...
- 解决mstsc无法连接问题:由于没有远程桌面授权服务器可以提供许可证
一.故障案例① 今天上午在给测试组的IIS新增https的时候,发现远程弹出如下错误: 由于没有远程桌面授权服务器可以提供许可证,远程会话被中断.请跟服务器管理员联系. 度了度,原来也是很常见的一种错 ...
- Server2008R2:由于没有远程桌面授权服务器可以提供许可证,.....错误的解决 ---设计师零张
一直使用远程桌面连接一台windows2008server服务器,今天突然报错,连不上了: “由于没有远程桌面授权服务器可以提供许可证,远程会话被中断.请跟服务器管理员联系.” 由于是 ...
- ”由于没有远程桌面授权服务器可以提供许可证,远程会话被中断“的解决方案
由于windows server 2012 R2 Datacenter 安装了 远程桌面角色,但是这个角色是120天免费的,需要购买授权的. 解决方案: 删除这个角色,就可以正常进行远程桌面连接了.但 ...
- 处理问题:windows server 2016由于没有远程桌面授权服务器可以提供许可证,远程会话被中断。请跟服务器管理员联系
windows server可以多用户同时登陆,默认最大远程登录数量为2,如果有更多人需要同时远程登录,则需要安装远程桌面授权服务,第一次安装后,免费期为120天,超过则无法正常远程登录. 解决办法如 ...
- windows Sever 2012 远程提示:由于没有远程桌面授权服务器可以提供许可证,远程会话被中断。请跟服务器管理员联系。
远程windows Sever 2012 时候 远程提示:由于没有远程桌面授权服务器可以提供许可证,远程会话被中断.请跟服务器管理员联系. 原因: windows server可以多用户同时登陆,默认 ...
- 远程桌面授权server没有提供许可证问题解决方法
今天远程server报如图所看到的错误,网上查找的方法 方法一:(亲測有效) mstsc /V:192.168.0.3 /admin 方法二:(因为server正在使用中,未作測试) 删除远程桌面服 ...
- Windows远程报错:由于没有远程桌面授权服务器可以提供许可证,远程会话被中断
故障原因:Windowsserver超过两人的远程连接是收费的,有120天免费试用期,超过这个时间再连接就会报错. 解决方法一: 进行续费 解决方法二: 1,在运行里运行 mstsc /v:ip ...
- 配置IIS服务器提供APP文件下载
[IIS7.IIS7.5] 1)打开IIS服务管理器,左边点到计算机(也可设置特定网站) 2)右边功能项中找到MIME类型,双击打开3)右键“添加”4)扩展名中填写".apk",M ...
随机推荐
- 菜鸟系列之C/C++经典试题(三)
设计包括min函数的栈 题目:定义栈的数据结构,要求加入一个min函数,可以得到栈的最小元素.要求函数min.push以及pop的时间复杂度都是O(1). 分析:这是2006年google的一道面试题 ...
- ios开发之自己定义默认生成的导航栏 标题 颜色 返回button
一 改动导航栏颜色 导航栏在哪个页面代码放在那里面 self.navigationController.navigationBar.tintColor = [UIColor colorWithR ...
- linux UDP,TCP相关特性
好长时间没使用网络编程忘得差不多了,写了TCP,UDP测试代码,得出以下结论: 一:UDP特性 1. UDP sendto函数不管对端是否存在(即使对端原本存在,现在已经关闭了),都义无反顾的发送 ...
- Spring源码深度解析——笔记
1.spring容器的基本用法 xml配置 <bean id="myTestBean" class="bean.MyTestBean"/> 调用 B ...
- dubbo简单配置与使用
dubbo简介 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进. 单一应用架构 当网站流量很小时 ...
- 直播:中国HBase技术社区第一届MeetUp
6月6日,由中国HBase技术社区组织,阿里云主办的中国第一届HBase Meetup将在北京举行,来自阿里.小米.滴滴.360等公司的各位大神会共同探讨HBase2.0的技术革新,HBase在国内各 ...
- es 300G 数据删除 执行计划 curl REST 操作
es 300G 数据删除 [es union_2017执行计划] [测试执行环境]线上D服务器[测试用例]get:curl -XGET ES:9200/_cat/indices?v post:curl ...
- Tomcat的虚拟主机的配置
比如:配置一个虚拟主机的名字是www.sina.com 1 改动window系统中的HOST文件[C:\WINDOWS\system32\drivers\etc\hosts] 127.0.0.1 ...
- POJ1321 棋盘问题 —— DFS回溯
题目链接:http://poj.org/problem?id=1321 棋盘问题 Time Limit: 1000MS Memory Limit: 10000K Total Submissions ...
- 计算机学院大学生程序设计竞赛(2015’12)Happy Value
Happy Value Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...