在 System.Net.Http.Headers 命名空间中,HttpHeaders.TryAddWithoutValidation和HttpHeaders.Add有什么区别?
具体来说,调用 Add 方法时会发生什么验证?Add() 的文档简单地说:
“标头值将被解析和验证。”
在 System.Net.Http.Headers 命名空间中,HttpHeaders.TryAddWithoutValidation和HttpHeaders.Add有什么区别?
具体来说,调用 Add 方法时会发生什么验证?Add() 的文档简单地说:
“标头值将被解析和验证。”
使用 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
(双关语)类似的行为,即如果标头名称不符合函数中的任何一个条件,它就会引发异常。
TryAddWithoutValidation
不会尝试解析给出的值以查看它是否有效(例如,有效的“类型”值或单值标头的多个值)。 Add
在尝试添加标头值之前首先解析值以执行前面提到的检查