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()
関数内で行われます。
つまり、名前がnullでないかどうか、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
ヘッダー値の追加を試みる前に、最初に値を解析して前述のチェックを実行します