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()関数内で行われます。

つまり、名前が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(しゃれを意図したもの)を除いて、同様の動作をします。

于 2013-02-20T21:56:05.350 に答える
2

TryAddWithoutValidation与えられた値を解析して、それが有効かどうかを確認しようとはしません(たとえば、値の有効な「タイプ」または単一値ヘッダーの複数の値)。 Addヘッダー値の追加を試みる前に、最初に値を解析して前述のチェックを実行します

于 2013-02-20T22:03:51.760 に答える