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

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

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

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

Ни это:

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

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

6 ответов

Решение
if (Request.Headers["XYZComponent"].Count() > 0)

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

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

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

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

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

Нулевой оператор слияния?? вернет пустую строку, если заголовок равен нулю, и остановит его, выдав исключение NullReferenceException.

Вариант вашей второй попытки также будет работать:

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

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

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

Возвращает false, если значение заголовка равно false, или если заголовок не был установлен или если заголовок имеет любое другое значение, отличное от true или false. Вернет true, если значение Header является строкой 'true'

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

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

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

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

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

который проверит, установлено ли оно в true. Это должно быть защищено от ошибок, поскольку не заботится о пробелах в начале / конце и не учитывает регистр (bool.TryParse работает на 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)

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

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

В ядре dotnet Request.Headers["X-MyCustomHeader"] возвращается StringValuesкоторый не будет нулевым. Вы можете проверить счетчик, чтобы убедиться, что он нашел ваш заголовок следующим образом:

var myHeaderValue = Request.Headers["X-MyCustomHeader"];
if(myHeaderValue.Count == 0) return Unauthorized();
string myHeader = myHeaderValue.ToString(); //For illustration purposes.

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

if (Request.Headers.AllKeys.Contains("XYZComponent"))
{
    // Can now check if the value is true:
    var value = Convert.ToBoolean(Request.Headers["XYZComponent"]);
}
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
if ((Request.Headers["XYZComponent"] ?? "") == "true")
{
    // header is present and set to "true"
}
Другие вопросы по тегам