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

时间:2010-05-04 21:25:24

标签: c# .net http

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

5 个答案:

答案 0 :(得分:9)

您可以使用.NET Framework 4.0及更高版本中的HttpEncoder.HeaderNameValueEncode Method

对于以前版本的.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;
}

仅供参考

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

答案 1 :(得分:4)

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

答案 2 :(得分:0)

这与HeaderNameValueEncode()完成相同的工作,但也会对%字符进行编码,以便以后可以可靠地解码标题。

static string EncodeHeaderValue(string value)
{
    return Regex.Replace(value, @"[\u0000-\u0008\u000a-\u001f%\u007f]", (m) => "%"+((int)m.Value[0]).ToString("x2"));
}

static string DecodeHeaderValue(string encoded)
{
    return Regex.Replace(encoded, @"%([0-9a-f]{2})", (m) => new String((char)Convert.ToInt32(m.Groups[1].Value, 16), 1), RegexOptions.IgnoreCase);
}

答案 3 :(得分:-1)

Mayeb这个? UrlEncode Function

答案 4 :(得分:-1)

抱歉它不在我的头顶但是对于你的请求对象,应该有一个可以添加的头文件对象。

即。 request.headers.add( “嗒嗒”);

这不是现场,但它应该指向正确的方向。