2016-08-31 4 views
0

У меня есть ActionFilterAttribute, который должен получить значение cookie из запроса. Вот соответствующий код:Есть ли лучший способ получить значение cookie в ActionFilterAttribute?

List<CookieState> cookies = actionContext.Request.Headers.GetCookies("NameOfTheCookieIWant").FirstOrDefault().Cookies.ToList(); 

if (cookies == null) 
{ 
    throw new ArgumentNullException("cookie"); 
} 

string value = ""; 
cookies.ForEach(cookie => { 
    if (cookie.Name == "NameOfTheCookieIWant") { 
     value = cookie.Value; 
    } 
}); 

Так что я должен идти в заголовки и получить заголовок печенья, который содержит имя куков я хочу. Но это дает мне коллекцию CookieHeaderValues, поэтому я должен взять первый из них, который сам содержит свойство Cookies, которое представляет собой коллекцию CookieStates. Я превращаю эту коллекцию в список и запускаю forEach на ней, пока не найду CookieState, чье имя совпадает с именем куки-файла, которое я хочу, а затем сохраните значение этого CookieState.

Мне кажется сумасшедшим, что мне нужно пройти столько, чтобы получить значение cookie. Наверняка есть лучший, более прямой способ получить один конкретный куки-файл, чье имя я знаю, и его ценность?

+0

Ваш вопрос о проекте MVC или WebApi? Добавьте соответствующий тег. Однако, похоже, это касается WebApi. –

+0

Я знал, что забыл. Спасибо, добавлен тег asp.net-web-api. –

ответ

2
cookie = actionContext.Request.Headers.GetCookies("NameOfTheCookieIWant").FirstOrDefault(); 

if (cookie != null) 
{ 
    string val = cookie["NameOfTheCookieIWant"].Value; 
} 
+0

Это улучшение, которое я искал, спасибо! –

+1

Вот ссылка [https://github.com/datafile4/book-store/blob/beta/BookStore/BookStore/Controllers/Attributes.cs) на образец проекта WebApi, с которым мы с моими друзьями в настоящее время работаем. который предназначен только для обучения. Сейчас на стадии разработки, но я думаю, вы найдете это полезным. –

1
var cookie = actionContext.RequestContext.HttpContext.Request.Cookies["NameOfTheCookieIWant"]; 
var value = cookie == null ? "" : cookie.Value 
+0

Я получаю «HttpActionExecutedContext» не содержит определения для «RequestContext», когда я пытаюсь это сделать; возможно, это решение MVC, которое не работает в WebAPI? –

+0

Этот ответ кажется для проекта MVC, в то время как вопрос касается WebApi. Но это не ваша вина, автор не добавил ни тегов. –

+0

null проверка может быть упрощена как 'var value = cookie? .Value ?? ""; ' –

0

Я бы сказал написать класс-оболочку или функцию полезности для получения значения куки, особенно если вы должны делать это снова и снова.