桌面应用也可以提供HTTP文件下载2014-03-09 csdn博客 东邪独孤以往,我们肯定知道,在搞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;}