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

Web API and MVC in the same project with Session States

我一直在研究一个 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 action返回的答案是HTML,客户端显然无法处理这个答案,我还没有找到正确处理的方法。

API 操作可以处理答案,但 Web API 默认不处理会话状态;你必须调整它才能做到,我不知道这两个会话是否相同。

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

谢谢。

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

您可以强制您的操作方法为 return JSON 或纯文本。操作的类型仍然是 ActionResult(它可能是可选的 JsonResult),但您可以 return Json()Content().

例如:

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

我还建议您对 return json 的 Web API 操作,而不是原语。任何客户端都将更容易解析响应。