具有会话状态的同一项目中的Web API和MVC

时间:2015-06-20 00:08:19

标签: c# asp.net-mvc asp.net-web-api session-state

我一直在研究ASP .Net MVC应用程序,该应用程序将从具有不同配置的不同站点登录请求(因此我无法使用FormsAuthentication SSO方式)。我决定解决这个问题的方法是创建临时登录请求令牌,因此每个令牌只能使用一次,并且使用这些令牌,应用程序将进行用户会话。

为了避免不必要地生成令牌,我想先询问服务器用户是否已经登录。我决定通过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不处理会话状态;你必须调整它,以便它可以,我不知道两个会话是否会相同。

我不确定哪一种是正确的方法,或者我是否应该尝试另一种方法来解决这个问题。

谢谢。

1 个答案:

答案 0 :(得分:0)

MVC行动不应该返回布尔值。这并不一定意味着你需要返回一个完整的视图对象,因此查询动作将导致一个完整的html,这很难解析。

您可以强制您的操作方法返回JSON或纯文本。操作的类型仍为ActionResult(可选择JsonResult),但您可以返回Json()Content()

例如:

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

我还建议你的Web API动作返回json,而不是原语。任何客户都可以更轻松地解析响应。