web-dev-qa-db-ja.com

Request.Headers値の取得

非常に簡単ですが、壁を駆け上がらせます! Webアプリケーションで使用するコンポーネントがあり、Webリクエスト中にヘッダー「XYZComponent = true」を追加することで自身を識別します-私が抱えている問題は、ビューでこれをどのように確認しますか?

以下は動作しません:

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

これも:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

41
Sunday Ironfoot

ヘッダーが存在します:

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

またはさらに良い:

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

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

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

アドオン:ヌル可能ブール値を返すこの拡張メソッドを使用すると、これをより簡単にできます。無効な入力と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)
9
Lasse Espeholt

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

public ActionResult Index()
{
    var xyzComponent = Request.Headers["xyzComponent"];
    var model = new MyModel 
    {
        IsCustomHeaderSet = (xyzComponent != null)
    }
    return View(model);
}
3
Darin Dimitrov
if ((Request.Headers["XYZComponent"] ?? "") == "true")
{
    // header is present and set to "true"
}
1
LukeH
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
1
abatishchev

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

if (Request.Headers.AllKeys.Contains("XYZComponent"))
{
    // Can now check if the value is true:
    var value = Convert.ToBoolean(Request.Headers["XYZComponent"]);
}
1
Rob