在System.Net.Http.Headers命名空间中,HttpHeaders.TryAddWithoutValidation和HttpHeaders.Add之间有什么区别?
具体来说,调用Add方法时会进行哪些验证? Add()的文档只是声明:
“标头值将被解析和验证。”
答案 0 :(得分:11)
使用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;
}
相比之下,添加方法与异常(双关语)具有类似的行为,如果标题名称因任何一个条件失败而抛出异常TryCheckHeaderName
功能。
答案 1 :(得分:1)
TryAddWithoutValidation
不会尝试解析给定的值以查看它是否有效(例如,有效的“类型”值或单值标头的多个值)。在尝试添加标头值
Add
首先解析该值以执行前面提到的检查