Получение значения Request.Headers - PullRequest
28 голосов
/ 20 августа 2010

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

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

И не это:

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

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

Ответы [ 6 ]

41 голосов
/ 20 августа 2010
if (Request.Headers["XYZComponent"].Count() > 0)

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

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

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

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

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

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

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

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

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

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

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

9 голосов
/ 20 августа 2010

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

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)
3 голосов
/ 20 августа 2010

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

public ActionResult Index()
{
    var xyzComponent = Request.Headers["xyzComponent"];
    var model = new MyModel 
    {
        IsCustomHeaderSet = (xyzComponent != null)
    }
    return View(model);
}
1 голос
/ 21 августа 2010

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

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