48

非常に単純なことですが、私を壁に追いやるのです! Web リクエスト中に "XYZComponent=true" というヘッダーを追加することで自分自身を識別する Web アプリケーションで使用するコンポーネントがあります。

以下は動作しません:

if (Request.Headers["XYZComponent"].Count() > 0)

これも:

if (Request.Headers.AllKeys.Where(k => k == "XYZComponent").Count() > 0)

ヘッダー変数が設定されていない場合、どちらも例外をスローします。どんな助けでも大歓迎です。

4

7 に答える 7

62
if (Request.Headers["XYZComponent"].Count() > 0)

... 返された文字列の文字数をカウントしようとしますが、ヘッダーが存在しない場合は NULL が返されるため、例外がスローされます。2番目の例は効果的に同じことを行います。ヘッダーのコレクションを検索し、存在しない場合は NULL を返します。次に、文字数を数えようとします。

代わりにこれを使用してください:

if(Request.Headers["XYZComponent"] != null)

または、空白または空の文字列を未設定として扱いたい場合は、次を使用します。

if((Request.Headers["XYZComponent"] ?? "").Trim().Length > 0)

Null 合体演算子 ?? ヘッダーが null の場合は空の文字列を返し、NullReferenceException のスローを停止します。

2 回目の試行のバリエーションも機能します。

if (Request.Headers.AllKeys.Any(k => string.Equals(k, "XYZComponent")))

編集:申し訳ありませんが、値trueを明示的にチェックしていることに気付きませんでした:

bool isSet = Boolean.TryParse(Request.Headers["XYZComponent"], out isSet) && isSet;

Header 値が false の場合、または Header が設定されていない場合、または Header が true または false 以外の値である場合は、false を返します。ヘッダー値が文字列「true」の場合、true を返します

于 2010-08-20T10:46:54.807 に答える
13

ヘッダーが存在します:

if (Request.Headers["XYZComponent"] != null)

またはさらに良い:

string xyzHeader = Request.Headers["XYZComponent"];
bool isXYZ;

if (bool.TryParse(xyzHeader, out isXYZ) && isXYZ)

true に設定されているかどうかを確認します。これは、先頭/末尾の空白を気にせず、大文字と小文字を区別しないため、誰にでもできるはずです (bool.TryParse動作しますnull)

アドオン: null 許容ブール値を返すこの拡張メソッドを使用すると、これをより簡単にすることができます。無効な入力と null の両方で機能するはずです。

public static bool? ToBoolean(this string s)
{
    bool result;

    if (bool.TryParse(s, out result))
        return result;
    else
        return null;
}

使用法 (これは拡張メソッドであり、インスタンス メソッドではないため、例外はスローされませんnull。ただし、混乱する可能性があります):

if (Request.Headers["XYZComponent"].ToBoolean() == true)
于 2010-08-20T10:34:05.413 に答える
5

まず、あなたの見解ではこれを行いません。ビューがカスタム HTTP ヘッダーを気にする必要がなく、ビュー モデルにデータを表示するだけになるように、コントローラーでそれを行い、ビュー モデルをビューに返します。

public ActionResult Index()
{
    var xyzComponent = Request.Headers["xyzComponent"];
    var model = new MyModel 
    {
        IsCustomHeaderSet = (xyzComponent != null)
    }
    return View(model);
}
于 2010-08-20T10:36:31.607 に答える
3

次のコードを使用すると、目的のヘッダーの存在を確認できますRequest.Headers

if (Request.Headers.AllKeys.Contains("XYZComponent"))
{
    // Can now check if the value is true:
    var value = Convert.ToBoolean(Request.Headers["XYZComponent"]);
}
于 2010-08-20T23:29:49.873 に答える
2
string strHeader = Request.Headers["XYZComponent"]
bool bHeader = Boolean.TryParse(strHeader, out bHeader ) && bHeader;

if "true" than true
if "false" or anything else ("fooBar") than false

また

string strHeader = Request.Headers["XYZComponent"]
bool b;
bool? bHeader = Boolean.TryParse(strHeader, out b) ? b : default(bool?);

if "true" than true
if "false" than false
else ("fooBar") than null
于 2010-08-20T10:41:45.467 に答える
2
if ((Request.Headers["XYZComponent"] ?? "") == "true")
{
    // header is present and set to "true"
}
于 2010-08-20T10:37:16.047 に答える