ASP.NET Web API 会话数据

3
我需要在Web API项目的Session Data中存储一个大对象。随后,客户端上的一些HTML小部件需要访问Web API中的会话数据,并使用该数据执行不同的操作,例如绘制数据的图表小部件,列出数据的HTML表格小部件等。为了避免为每个客户端小部件重新计算该大对象,我需要仅计算一次并将其存储在会话数据中,以便在会话期间任何在同一会话内运行的小部件都可以在不同时间访问该数据,而无需等待服务器重新计算数据。
每个小部件都应使用不同的GET请求URL访问Web API服务器项目。
感谢您的帮助。我或许对如何完成此操作有高级别的概述,但我需要指引。
2个回答

7

以下是如何操作的方法。

您的项目中可能有 Repository(仓储模式) 并且在 Repository 中有一个方法来计算您所需的小部件等的结果。请在 Repository 方法中定义所有数据计算逻辑,然后在您的 apiController 的 Get 请求或 GetById 中调用该 Repository 并创建一个会话变量,您可以在您的视图中使用它。如果您正在使用 Asp.Net Mvc 作为前端,则可以在 Mvc 控制器中执行相同的存储数据到会话的调用。

public class YourControllerName:apiController
{
    public IQueryable<AnyNameListDTO> Get()
    {
        //Your other Code will go here 
        var session = HttpContext.Current.Session;
        if (session != null)
        {
            if (session["AnyName"] == null)
            {
                session["AnyName"] = TheRepository.YourMethodName();
            }
        }
    }
}

如果您正在使用Asp.Net Mvc作为视图(UI),并且将要消耗Web Api,那么您可以在控制器操作方法中创建相同的会话。

public class YourControllerName:Controller
{
    public ActionResult Get()
    {
        //Your other Code will go here 
        Session["AnyName"] = TheRepository.YourMethodName();
    }
}   

你也可以使用HTML5本地存储。将数据存储在其中,然后使用它。

HTML5本地存储是存储每个客户端大量数据的最佳选择,值得加1。当你有一台拥有足够空闲内存的计算机或智能设备时,为什么要占用服务器的内存呢? - mason
@ProgrammingNinja 我如何从一个独立的HTML页面访问会话数据而不在Web API中?我认为这是我需要获取请求URL的地方。 - Logan H
@ProgrammingNinja 我明白了,但是我需要另一个HTML客户端,不是在Web API视图中,来检索存储在Web API会话中的数据。我做了一些研究,发现了CORS(跨源资源共享),但我不知道是否必要? - Logan H
请查看此答案链接:https://dev59.com/dGkw5IYBdhLWcg3w2-XH - Husrat Mehmood
如何从ApiController中获取MvcController的会话值? - Aiyoub A.
显示剩余2条评论

2

已解决

从跨域的 .html 页面检索 Web API 会话数据

这就是跨域资源共享

ValuesController.cs Web API 中)

namespace TestWEB_API.Controllers
{
  public class ValuesController : ApiController
  {

    // GET api/values
    public string Get()
    {
        var session = HttpContext.Current.Session;
        if (session != null)
        {
            if (session["Time"] == null)
                session["Time"] = DateTime.Now;
            return "Session Time: " + session["Time"];
        }
        return "Session is not working";
    }// End Get()

    ...

  }//End Class()
}//End Namespace

然后是 .html 页面(不是在 Web API 中!!!)存放在另一个 .war 文件中。

httpSessionTest.html

<!DOCTYPE html>

<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    <title></title>

    <script type="text/javascript" src="../Desktop/jquery-2.1.1.js"></script>

</head>
<script>
// !!------------- THIS IS WHAT I NEEDED! ---------------!!
$(function()
{
        $.getJSON('http://localhost:Port/api/values', function(stringPayLoad)
        {
            alert(stringPayLoad);
            $("#dataP").text(stringPayLoad);
        });
});

</script>
<body>
<h3> Web API Session Test </h3>
<p id="dataP">!!! If you see this, it means that the session data didn't load. :(</p>

</body>
</html>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接