2015-06-20 1 views
0

Я работаю над ASP. NET MVC-приложением, которое будет принимать запросы на вход с разных сайтов с различными конфигурациями (поэтому я не могу использовать способ SSO FormsAuthentication). То, как я решил это решить, было создание токенов входа для временного входа, поэтому каждый токен можно использовать только один раз, и с этими токенами приложение будет выполнять сеанс пользователя.Веб-API и MVC в том же проекте с состояниями сеанса

Чтобы избежать генерации токенов ненужно, я подумал о том, чтобы сначала спросить сервер, если пользователь не был уже зарегистрирован. И я решил попробовать это через HttpClient. Код написан следующим образом.

  var client = new HttpClient { BaseAddress = new Uri("http://mywidget.com") }; 
      client.Timeout = TimeSpan.FromMilliseconds(18000); 
      client.DefaultRequestHeaders.Accept.Clear(); 
      client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

      var response = client.GetAsync(String.Format("/userIsLogged/{0}", userId)).Result; 
      response.EnsureSuccessStatusCode(); 
      bool isLogged = response.Content.ReadAsAsync<bool>().Result; 
      return isLogged; 

Я пришел с двумя возможными способами, чтобы сделать проверку. Я написал одно и то же действие в Web API и MVC следующим образом.

[HttpGet] 
    public bool UserIsLogged(int userId) 
    { 
     return (HttpContext.Current.Session != null && ((int)HttpContext.Current.Session["userId"]) == userId); 
    } 

С обоими я нашел проблемы, и я не знаю, какой сервер лучше для моих целей.

Действие MVC вернуло ответ как HTML, и клиент, очевидно, не смог обработать ответ, и я еще не нашел способ правильно его обработать.

Действие API может обрабатывать ответ, но Web API не обрабатывает состояния сеанса по умолчанию; вы должны настроить его так, чтобы он мог, и я не знаю, будут ли обе сессии одинаковыми.

Я не уверен, какой из них - правильный путь, или если я попробую другую альтернативу этой проблеме.

Thank you.

ответ

0

Действия MVC не должны возвращать булевы. Это не обязательно означает, что вам нужно вернуть весь объект представления, поэтому запрос к действию приведет к полному html, который трудно разобрать.

Вы можете заставить свои методы действий вернуть JSON или обычный текст. Тип действия по-прежнему ActionResult (он может быть дополнительно JsonResult), но вы можете вернуть Json() или Content().

Например:

public ActionResult UserIsLogged(int userId) 
{ 
    if (....) 
    { 
     return Json(true); 
    } 
    return Json(false); 
} 

Я хотел бы предложить также свои действия Web API для возврата JSon Aswell, вместо примитивов. Клиенту будет проще проанализировать ответ.

+0

Спасибо. Это сработало! Вы были правы. Отправляя ответ как Json, ответ был доступен для чтения клиентом, хотя это был результат действия. Вы правы и о другом. Я начну посылать все как Json, и посмотреть, как это работает. –