You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#中从包含嵌套参数的URL提取QueryParameter?

C#提取URL中的所有查询参数(含嵌套returnUrl参数)

需求说明

给定URL:http://localhost:3000/Login/SignIn?timeout=5000&returnUrl=/Home.ashx?param1=555&param2=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&param2=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&param2=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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 13:35:35