10

在 System.Net.Http.Headers 命名空间中,HttpHeaders.TryAddWithoutValidationHttpHeaders.Add有什么区别?

具体来说,调用 Add 方法时会发生什么验证?Add() 的文档简单地说:

“标头值将被解析和验证。”

4

2 回答 2

15

使用 Reflector,这是TryAddWithoutValidation方法在内部执行的操作:

if (!this.TryCheckHeaderName(name))
{
    return false;
}
if (value == null)
{
    value = string.Empty;
}
AddValue(this.GetOrCreateHeaderInfo(name, false), value, StoreLocation.Raw);
return true;

工作发生在TryCheckHeaderName()函数内部。

它归结为检查名称是否不为空以及它是否与 HTTP 协议的 RFC 匹配(即它不包含无效字符等),以及根据一组不允许的标头检查标头。

这是源代码:

bool TryCheckHeaderName(string name)
{
   if (string.IsNullOrEmpty(name))
   {
       return false;
   }
   if (HttpRuleParser.GetTokenLength(name, 0) != name.Length)
   {
       return false;
   }
   if ((this.invalidHeaders != null) && this.invalidHeaders.Contains(name))
   {
       return false;
   }
   return true;
}

相比之下,Add方法具有与异常TryCheckHeaderName(双关语)类似的行为,即如果标头名称不符合函数中的任何一个条件,它就会引发异常。

于 2013-02-20T21:56:05.350 回答
2

TryAddWithoutValidation不会尝试解析给出的值以查看它是否有效(例如,有效的“类型”值或单值标头的多个值)。 Add在尝试添加标头值之前首先解析值以执行前面提到的检查

于 2013-02-20T22:03:51.760 回答