如何在C#中编码自定义HTTP标头

ant*_*nio 12 .net c# http

是否有一个类似于HttpUtility的类来编码自定义标头的内容?理想情况下,我希望保持内容可读.

liu*_*gbo 9

您可以在.NET Framework 4.0及更高版本中使用HttpEncoder.HeaderNameValueEncode方法.

对于以前版本的.NET Framework,您可以使用HttpEncoder.HeaderNameValueEncode参考页面上记录的逻辑来滚动自己的编码器:

  • Unicode值小于ASCII字符32的所有字符(ASCII字符9除外)都被URL编码为%NN格式,其中N个字符表示十六进制值.

  • ASCII字符9(水平制表符)不是URL编码的.

  • ASCII字符127编码为%7F.

  • 所有其他字符均未编码.

更新:

正如OliverBock指出的那样,HttpEncoder.HeaderNameValueEncode方法受到保护并且是内部的.我去了开源Mono项目并找到了mono的实现

void HeaderNameValueEncode (string headerName, string headerValue, out string encodedHeaderName, out string encodedHeaderValue)
{
        if (String.IsNullOrEmpty (headerName))
                encodedHeaderName = headerName;
        else
                encodedHeaderName = EncodeHeaderString (headerName);

        if (String.IsNullOrEmpty (headerValue))
                encodedHeaderValue = headerValue;
        else
                encodedHeaderValue = EncodeHeaderString (headerValue);
}

static void StringBuilderAppend (string s, ref StringBuilder sb)
{
        if (sb == null)
                sb = new StringBuilder (s);
        else
                sb.Append (s);
}

static string EncodeHeaderString (string input)
{
        StringBuilder sb = null;

        for (int i = 0; i < input.Length; i++) {
                char ch = input [i];

                if ((ch < 32 && ch != 9) || ch == 127)
                        StringBuilderAppend (String.Format ("%{0:x2}", (int)ch), ref sb);
        }

        if (sb != null)
                return sb.ToString ();

        return input;
}
Run Code Online (Sandbox Code Playgroud)

仅供参考

[这里](https://github.com/mono/mono/blob/master/mcs/class/System.Web/System.Web.Util/HttpEncoder.cs)

  • HeaderNameValueEncode()受保护+内部。 (2认同)

R.T*_*tov 6

对我来说帮助 Uri.EscapeDataString(headervalue)


Dan*_*ani -2

梅耶布这个? UrlEncode 函数