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

在C# WebApi中修改RequestUri:URL参数加解密实现需求

解决ASP.NET WebApi中DelegatingHandler解密URL路由段的问题

核心实现思路

客户端将api/employee/getInfo/{name}/{lastname}/{date}中的参数段加密后,WebApi通过DelegatingHandler在请求进入路由匹配前解密该段,重构原始URL,让控制器能正确匹配路由。

1. 实现自定义DelegatingHandler

创建处理解密逻辑的Handler,在SendAsync方法中修改RequestUri:

public class DecryptRouteHandler : DelegatingHandler
{
    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        var uri = request.RequestUri;
        var pathSegments = uri.Segments;

        // 匹配目标路由结构:api/employee/getInfo/{加密段}
        if (pathSegments.Length >= 5 
            && pathSegments[2].Equals("employee/", StringComparison.OrdinalIgnoreCase)
            && pathSegments[3].Equals("getInfo/", StringComparison.OrdinalIgnoreCase))
        {
            var encryptedSegment = pathSegments[4].TrimEnd('/');
            try
            {
                // Base64解码(生产环境请替换为AES等安全加密算法)
                var decodedBytes = Convert.FromBase64String(encryptedSegment);
                var decryptedPath = Encoding.UTF8.GetString(decodedBytes);

                // 重构完整路径
                var newPath = string.Concat(pathSegments.Take(4)) + decryptedPath;
                var newUri = new UriBuilder(uri)
                {
                    Path = newPath
                }.Uri;

                // 更新请求的RequestUri
                request.RequestUri = newUri;
            }
            catch (FormatException)
            {
                return request.CreateErrorResponse(HttpStatusCode.BadRequest, "无效的加密路由参数");
            }
        }

        // 将处理后的请求传递到后续管道
        return await base.SendAsync(request, cancellationToken);
    }
}

2. 注册Handler到WebApi配置

在WebApiConfig.cs中注册自定义Handler,确保它在路由匹配前执行:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // 添加解密Handler
        config.MessageHandlers.Add(new DecryptRouteHandler());

        // 保留原有路由配置
        config.Routes.MapHttpRoute(
            name: "EmployeeApi",
            routeTemplate: "api/employee/getInfo/{name}/{lastname}/{date}",
            defaults: new { controller = "Employee", action = "GetInfo" }
        );
    }
}

3. 控制器路由匹配验证

确保控制器的路由与原始定义一致,无需修改:

public class EmployeeController : ApiController
{
    [HttpGet]
    [Route("api/employee/getInfo/{name}/{lastname}/{date}")]
    public IHttpActionResult GetInfo(string name, string lastname, string date)
    {
        // 执行业务逻辑并返回结果
        return Ok(new { FullName = $"{name} {lastname}", BirthDate = date });
    }
}

关键注意事项

  • 路径索引校验:URL的Segments数组第一个元素为空字符串,需根据实际路由结构确认加密段的索引位置。
  • 加密安全性:示例使用Base64仅为演示,生产环境必须采用对称加密(如AES),避免参数明文泄露。
  • 错误处理:捕获解密失败的异常,返回明确的错误响应,避免请求进入后续管道报错。

内容的提问来源于stack exchange,提问作者Jmartinez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 14:55:15