求助:UWP中如何获取IIS服务器的目录列表
获取IIS目录下所有图片列表的可行方案
嘿,当然可行啦!既然你已经在IIS的web.config里启用了目录浏览功能,这事儿就好办了~ 下面给你一步步说清楚怎么实现:
核心原理
当你启用目录浏览后,访问https://IISserver/pictures/这个目录URL时,IIS会返回一个自动生成的HTML页面,里面列出了该目录下所有文件和子目录的链接。你的任务就是请求这个页面,然后解析HTML提取出所有图片的完整URL。
具体实现步骤
请求目录页面
你需要把请求的URL换成目录地址https://IISserver/pictures/,而不是单个图片的URL。用你现有的HttpClient发起GET请求即可。解析HTML提取图片链接
因为返回的是HTML内容,直接字符串处理容易出错,推荐用.NET生态里常用的HtmlAgilityPack库来解析(需要先通过NuGet安装这个包)。
代码示例
using HtmlAgilityPack; using System.Net.Http; using System.Linq; using System.Collections.Generic; using System.Threading.Tasks; // 建议HttpClient采用单例模式(避免频繁创建销毁导致套接字耗尽) private static readonly HttpClient _httpClient = new HttpClient(); public async Task<List<string>> GetAllImageUrls() { var directoryUrl = "https://IISserver/pictures/"; List<string> imageUrls = new List<string>(); try { HttpResponseMessage response = await _httpClient.GetAsync(directoryUrl); response.EnsureSuccessStatusCode(); // 确保请求成功,否则抛出异常 string htmlContent = await response.Content.ReadAsStringAsync(); HtmlDocument htmlDoc = new HtmlDocument(); htmlDoc.LoadHtml(htmlContent); // 提取所有<a>标签的href属性,排除上级目录(../)和子目录(以/结尾的链接) var imageNodes = htmlDoc.DocumentNode.SelectNodes("//a[@href]") ?.Where(node => !node.Attributes["href"].Value.Equals("../") && !node.Attributes["href"].Value.EndsWith("/") ); if (imageNodes != null) { foreach (var node in imageNodes) { // 拼接成完整的URL string fullUrl = new Uri(new Uri(directoryUrl), node.Attributes["href"].Value).ToString(); imageUrls.Add(fullUrl); } } } catch (HttpRequestException ex) { // 处理请求异常,比如网络问题、权限限制等 Console.WriteLine($"请求出错:{ex.Message}"); } return imageUrls; }
注意事项
- 权限与配置检查:确保IIS的目录浏览功能确实生效,且该目录没有设置IP限制、身份验证等拦截规则,否则
HttpClient可能会收到403/401等错误响应。 - HttpClient最佳实践:不要每次请求都新建
HttpClient,推荐使用单例模式(如上面代码所示),避免系统套接字资源耗尽。 - 子目录处理:如果你的
pictures目录下还有子目录,上面的代码会自动排除它们;如果需要递归获取子目录里的图片,你可以在代码里添加递归逻辑,遍历每个子目录的URL重复上述步骤。
内容的提问来源于stack exchange,提问作者Maddin




