Подтвердить что ты не робот

Получение значения Request.Headers

Очень просто, я уверен, но подталкиваю меня к стене! Существует компонент, который я использую в своем веб-приложении, которое идентифицирует себя во время веб-запроса, добавляя заголовок "XYZComponent = true" - проблема, с которой я сталкиваюсь, заключается в том, как вы проверяете это в своем представлении?

Следующая работа не работает:

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

И это:

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

Оба исключают исключение, если переменная заголовка не была установлена. Любая помощь будет наиболее оценена.

4b9b3361

Ответ 1

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

... будет пытаться подсчитать количество символов в возвращаемой строке, но если заголовок не существует, он вернет NULL, поэтому он выбрасывает исключение. Ваш второй пример эффективно делает то же самое, он будет искать в коллекции заголовков и возвращать NULL, если он не существует, и затем вы пытаетесь подсчитать количество символов:

Используйте это вместо:

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

Или, если вы хотите обрабатывать пустые или пустые строки как не заданные, используйте:

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

Оператор Null Coalesce? будет возвращать пустую строку, если заголовок равен NULL, и останавливает его, бросая исключение NullReferenceException.

Будет также изменена ваша вторая попытка:

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

Изменить: Извините, вы не поняли, что вы явно проверяете значение true:

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

Будет возвращено значение false, если значение заголовка будет ложным или если заголовок не установлен или если заголовок имеет другое значение, отличное от true или false. Возвращает true, значение Header - это строка "true"

Ответ 2

Заголовок существует:

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

или даже лучше:

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

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

который будет проверять, установлено ли значение true. Это должно быть безупречным, потому что оно не заботится о ведущем/конечном пробеле и нечувствительно к регистру (bool.TryParse работает на null)

Addon:. Вы можете сделать это более простым с помощью этого метода расширения, который возвращает значение 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)

Ответ 3

Во-первых, вы не делаете этого с вашей точки зрения. Вы делаете это в контроллере и возвращаете модель представления в представление, чтобы представление не нуждалось в заботе о пользовательских HTTP-заголовках, а просто отображало данные в модели представления:

public ActionResult Index()
{
    var xyzComponent = Request.Headers["xyzComponent"];
    var model = new MyModel 
    {
        IsCustomHeaderSet = (xyzComponent != null)
    }
    return View(model);
}

Ответ 4

if ((Request.Headers["XYZComponent"] ?? "") == "true")
{
    // header is present and set to "true"
}

Ответ 5

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

Ответ 6

Следующий код должен позволить вам проверить наличие заголовка, в котором вы находитесь, в Request.Headers:

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