Получение значения Request.Headers
Очень просто, я уверен, но подталкиваю меня к стене! Существует компонент, который я использую в своем веб-приложении, которое идентифицирует себя во время веб-запроса, добавляя заголовок "XYZComponent = true" - проблема, с которой я сталкиваюсь, заключается в том, как вы проверяете это в своем представлении?
Следующая работа не работает:
if (Request.Headers["XYZComponent"].Count() > 0)
И это:
if (Request.Headers.AllKeys.Where(k => k == "XYZComponent").Count() > 0)
Оба исключают исключение, если переменная заголовка не была установлена. Любая помощь будет наиболее оценена.
Ответы
Ответ 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"]);
}