如何在C#中从包含嵌套参数的URL提取QueryParameter?
C#提取URL中的所有查询参数(含嵌套returnUrl参数)
需求说明
给定URL:http://localhost:3000/Login/SignIn?timeout=5000&returnUrl=/Home.ashx?param1=555¶m2=666,需要提取所有查询参数(包括returnUrl中嵌套的参数),并输出如下格式:
{ [0]: { timeout, 5000 }, [1]: { param1, 555 }, [2]: { param2, 666 } }
实现方案
通过Uri类解析URL,结合查询参数解析工具分别提取主URL和嵌套returnUrl中的参数,最后合并输出。
1. .NET Framework 实现(依赖System.Web)
using System; using System.Collections.Generic; using System.Web; public class UrlParameterExtractor { public static List<KeyValuePair<string, string>> ExtractAllParameters(string url) { var allParams = new List<KeyValuePair<string, string>>(); var uri = new Uri(url); // 解析主URL的查询参数 var mainQuery = HttpUtility.ParseQueryString(uri.Query); foreach (string key in mainQuery) { if (string.Equals(key, "returnUrl", StringComparison.OrdinalIgnoreCase)) { // 补全returnUrl的完整地址,避免相对路径解析问题 var returnUri = new Uri(uri.Scheme + "://" + uri.Authority + mainQuery[key]); var nestedQuery = HttpUtility.ParseQueryString(returnUri.Query); // 添加嵌套参数 foreach (string nestedKey in nestedQuery) { allParams.Add(new KeyValuePair<string, string>(nestedKey, nestedQuery[nestedKey])); } } else { // 添加主参数 allParams.Add(new KeyValuePair<string, string>(key, mainQuery[key])); } } return allParams; } // 测试调用 public static void Main() { string targetUrl = "http://localhost:3000/Login/SignIn?timeout=5000&returnUrl=/Home.ashx?param1=555¶m2=666"; var parameters = ExtractAllParameters(targetUrl); // 按指定格式输出 Console.WriteLine("{"); for (int i = 0; i < parameters.Count; i++) { var param = parameters[i]; Console.WriteLine($" [{i}]: {{ {param.Key}, {param.Value} }}{(i < parameters.Count - 1 ? "," : "")}"); } Console.WriteLine("}"); } }
2. .NET Core/.NET 5+ 实现(依赖System.Net.Http)
跨平台版本推荐使用QueryHelpers替代HttpUtility:
using System; using System.Collections.Generic; using System.Net.Http; public class UrlParameterExtractor { public static List<KeyValuePair<string, string>> ExtractAllParameters(string url) { var allParams = new List<KeyValuePair<string, string>>(); var uri = new Uri(url); // 解析主URL查询参数 var mainQuery = QueryHelpers.ParseQuery(uri.Query); foreach (var key in mainQuery.Keys) { if (string.Equals(key, "returnUrl", StringComparison.OrdinalIgnoreCase)) { // 利用Uri的相对路径解析能力补全地址 var returnUri = new Uri(uri, mainQuery[key]); var nestedQuery = QueryHelpers.ParseQuery(returnUri.Query); // 添加嵌套参数 foreach (var nestedKey in nestedQuery.Keys) { allParams.Add(new KeyValuePair<string, string>(nestedKey, nestedQuery[nestedKey])); } } else { // 添加主参数 allParams.Add(new KeyValuePair<string, string>(key, mainQuery[key])); } } return allParams; } // 测试调用 public static void Main() { string targetUrl = "http://localhost:3000/Login/SignIn?timeout=5000&returnUrl=/Home.ashx?param1=555¶m2=666"; var parameters = ExtractAllParameters(targetUrl); // 按指定格式输出 Console.WriteLine("{"); for (int i = 0; i < parameters.Count; i++) { var param = parameters[i]; Console.WriteLine($" [{i}]: {{ {param.Key}, {param.Value} }}{(i < parameters.Count - 1 ? "," : "")}"); } Console.WriteLine("}"); } }
注意事项
- .NET Framework需要引用
System.Web程序集;.NET Core/.NET 5+默认已包含System.Net.Http包。 - 代码对
returnUrl做了地址补全处理,避免相对路径无法解析查询参数的问题。 - 若需支持多层嵌套参数,可扩展逻辑递归解析。
内容的提问来源于stack exchange,提问作者Panday Kaz
相关产品推荐
相关产品推荐

