咨询:使用C# WebClient/HttpClient无法下载Web服务器.lst文件的解决办法
问题描述
使用C#的WebClient类编写文件下载代码:
using (var Client = new WebClient()) { Client.DownloadFile(Source, Target); }
下载.xml或.txt文件时正常,但下载.lst文件(资源管理器显示为“MASM Listing”文件)时出现404“未找到”错误,且已确认文件确实存在。已尝试在IIS中将.lst扩展名添加到允许列表,但问题依旧;改用HttpClient下载结果相同。
请问除了下载后重命名文件外,还有什么方法可以实现.lst文件的下载?
解决方案
1. 配置IIS的MIME类型
仅添加扩展名到允许列表可能不够,需要为.lst配置对应的MIME类型:
- 打开IIS管理器,找到目标站点,进入MIME类型
- 点击添加,扩展名填
.lst,MIME类型可设为text/plain(纯文本类)或application/octet-stream(通用二进制流) - 保存配置后重启站点,再尝试下载
2. 检查并修正URL编码
若Source URL中包含特殊字符(如空格、中文等),可能导致服务器无法正确解析文件路径。可对URL中的文件名部分进行URL编码:
// 拆分基础路径与文件名,编码后拼接完整URL string baseUrl = "http://your-server/path/"; string fileName = "example.lst"; string encodedFileName = System.Web.HttpUtility.UrlEncode(fileName); string fullUrl = $"{baseUrl}{encodedFileName}"; using (var client = new WebClient()) { client.DownloadFile(fullUrl, Target); }
3. 检查IIS请求过滤规则
确认IIS的请求过滤模块未阻止.lst文件:
- 进入站点的请求过滤,切换到文件扩展名标签
- 确保
.lst在允许列表中,且无对应的拒绝规则 - 同时检查隐藏段、隐藏文件设置,避免
.lst被误判为隐藏资源
4. 添加自定义请求头
部分服务器会根据Accept请求头限制返回的文件类型,可添加通配符Accept头强制服务器返回文件:
WebClient实现
using (var client = new WebClient()) { client.Headers.Add(System.Net.HttpRequestHeader.Accept, "*/*"); client.DownloadFile(Source, Target); }
HttpClient实现
using (var client = new HttpClient()) { client.DefaultRequestHeaders.Accept.Add( new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("*/*") ); byte[] fileBytes = await client.GetByteArrayAsync(Source); await System.IO.File.WriteAllBytesAsync(Target, fileBytes); }
5. 排查URL重写规则
若服务器启用了URL重写(如ASP.NET路由、IIS URL重写模块),需检查规则是否拦截了.lst请求:
- 进入站点的URL重写,查看现有规则
- 添加例外规则,允许
.lst文件的请求直接通过
6. 验证URL路径准确性
确认Source URL的大小写、路径与服务器上的文件完全匹配:
- Windows系统虽不区分大小写,但部分IIS配置可能启用了严格大小写检查
- 直接在浏览器中访问
SourceURL,验证是否能正常下载,排除代码外的路径问题
另外,“MASM Listing”只是.lst文件的关联类型,本身不会被系统或服务器默认禁止下载,问题根源还是服务器配置或请求处理环节的限制。
内容的提问来源于stack exchange,提问作者Nigel Tunnicliffe
相关产品推荐
相关产品推荐

