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

.NET Core是否内置HTTP Header非法字符自动转义支持及等效方法?

.NET Core中替代System.Web.Util.HttpEncoder.HeaderNameValueEncode()的方案

嘿,这个问题问得很到位!我之前在迁移.NET Framework项目到.NET Core的时候也碰到过一模一样的需求——HtmlEncoder.Default.Encode()确实会把很多HTTP头里允许的字符(比如单引号)也转义掉,完全不是我们想要的效果。

好消息是,.NET Core/ASP.NET Core里有专门针对HTTP头编码的官方替代方案,而且完全符合HTTP规范,不会过度转义:

官方推荐方案:使用Microsoft.AspNetCore.WebUtilities.HeaderUtilities

ASP.NET Core团队提供了HeaderUtilities类,它包含了EncodeHeaderName和EncodeHeaderValue两个静态方法,专门用来处理HTTP头名称和值的编码,行为和.NET Framework里的HeaderNameValueEncode()完全对齐,只会转义那些HTTP规范里明确禁止的字符(比如换行、回车、控制字符等),像单引号这类合法字符会原封不动保留。

步骤:

  1. 首先确保你的项目引用了Microsoft.AspNetCore.WebUtilities NuGet包(如果是ASP.NET Core Web项目,这个包通常已经默认包含了;如果是控制台/类库项目,需要手动安装)。
  2. 使用以下代码进行编码:
using Microsoft.AspNetCore.WebUtilities;

// 编码HTTP头名称
string originalHeaderName = "my-custom\nheader";
string encodedHeaderName = HeaderUtilities.EncodeHeaderName(originalHeaderName);

// 编码HTTP头值
string originalHeaderValue = "user's data with \n line break";
string encodedHeaderValue = HeaderUtilities.EncodeHeaderValue(originalHeaderValue);

手动实现方案(不依赖ASP.NET Core包)

如果你的项目不想引入ASP.NET Core相关的依赖包,也可以基于HTTP规范(RFC 7230)自己实现一个简化版的编码逻辑。核心就是只转义HTTP头里的无效控制字符和特殊分隔符:

public static class HttpHeaderEncoder
{
    public static string EncodeHeaderName(string name)
    {
        return EncodeHeaderComponent(name, isName: true);
    }

    public static string EncodeHeaderValue(string value)
    {
        return EncodeHeaderComponent(value, isName: false);
    }

    private static string EncodeHeaderComponent(string input, bool isName)
    {
        if (string.IsNullOrEmpty(input))
            return input;

        var sb = new StringBuilder(input.Length);
        foreach (char c in input)
        {
            // 根据RFC 7230,HTTP头名称只能包含token字符(字母、数字、以及!#$%&'*+-.^_`|~)
            // 头值可以包含更多字符,但控制字符(0-31,127)和部分特殊字符需要处理
            if (c is >= '\0' and <= '\x1F' or '\x7F')
            {
                // 转义控制字符为十六进制格式
                sb.Append($"\\x{(int)c:X2}");
            }
            else if (isName && !IsTokenCharacter(c))
            {
                // 头名称中的非token字符转义
                sb.Append($"\\x{(int)c:X2}");
            }
            else
            {
                sb.Append(c);
            }
        }
        return sb.ToString();
    }

    private static bool IsTokenCharacter(char c)
    {
        return char.IsLetterOrDigit(c) || "!#$%&'*+-.^_`|~".Contains(c);
    }
}

不过要注意,手动实现的话需要严格对齐RFC规范,长期来看还是官方的HeaderUtilities更靠谱,毕竟会跟着规范更新维护。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:21:03