每个选项卡的独立会话C#WebApi / Angular2 +

时间:2017-08-24 13:40:11

标签: c# angular session asp.net-web-api2

我们正在构建一个Web应用程序,允许用户打开使用此应用程序创建的不同项目。前端是一个带有REST架构的Angular 4应用程序,后端是一个C#Asp.net Web Api。

我们的问题是我们将所有后端数据存储在一个Session中(因为它是一个包含数学数据和公式的巨大对象),当我们在不同的选项卡中打开多个项目时,会话在每个选项卡之间变得相同它会造成干扰。

我们正在尝试找到一种方法,将app的每个实例(每个项目)与服务器中的唯一会话相连。我们寻找使用存储在window.name中的GUID作为每个选项卡,然后发送到存储我们对象的HttpContext.Current.Session["GUIDSessionID"];的服务器,但我们没有找到使它工作的方法,因为我们是c#的初学者发展。

以下是我们寻找解决方案的链接(没有成功):

提前致谢。 尼古拉斯

3 个答案:

答案 0 :(得分:0)

生成一个唯一的会话ID哈希或其他东西。 在Angular中存储它可以放置locale localStorage.setItem(' GUIDSessionID',' YourSessionID');。

如果你想在刷新localStorage.getItem之后得到它(' GUIDSessionID');

如果您使用新的生成新的SessionID登录,请删除旧的localStorage.removeItem(' GUIDSessionID')并设置新的。

答案 1 :(得分:0)

实现这一目标的最简单方法是 -

  • 从URL /查询字符串中读取项目ID,并将其放在页面上的某个隐藏字段中。
  • 使用键启动该项目ID创建所有会话变量。

例如,如果您的项目ID是' 654654481CEG',您的会话分配将是这样的:

Session[string.Format("{0}-projectName", "654654481CEG")] = "WhateverYourValueIs";

从会话中读回值时,您也会这样做 -

string strprojectName = Session[string.Format("{0}-projectName", "654654481CEG")].ToString();

答案 2 :(得分:0)

我和同事有同样的问题,我们使用了一些子会话:

<Grid Width="150" DataContext="{Binding DataContext.Progress, RelativeSource={RelativeSource AncestorType=xctk:BusyIndicator}}">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="Auto" />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition />
    </Grid.RowDefinitions>
    <TextBlock Grid.Row="0" Grid.Column="0" Text="{Binding Description}"/>
    <ProgressBar Grid.Row="1" Grid.Column="0" Value="{Binding Percentage}" Height="14" Margin="0,5,0,0"/>
</Grid>

我们做了如下: 后端

//We changed this
HttpContext.Current.Session["x"] = x;
HttpContext.Current.Session["y"] = y;
//To this
HttpContext.Current.Session["guid"] = new SessionContent{x = x, y = y };

这是一个控制器,例如:

public static class SessionUtils
{
    public class SessionContent
    {
        public XClass xProperty{ get; set; }
        public YClass yProperty{ get; set; }
    }

    public static string GetSessionGUID(IHttpRouteData route)
    {
        return route.Values["guid"].ToString();
    }

    public static XClass GetSessionXProperty(HttpContextBase httpContextBase, IHttpRouteData route)
    {
        return ((SessionUtils.SessionContent)httpContextBase.Session[GetSessionGUID(route)]).xProperty;
    }

    public static void SetSessionXProperty(HttpContextBase httpContextBase, IHttpRouteData route, XClass xProperty)
    {
        ((SessionUtils.SessionContent)httpContextBase.Session[GetSessionGUID(route)]).xProperty= xProperty;
    }

    public static YClass GetSessionYProperty(HttpContextBase httpContextBase, IHttpRouteData route)
    {
        return ((SessionUtils.SessionContent)httpContextBase.Session[GetSessionGUID(route)]).yProperty;
    }

    public static void SetSessionYProperty(HttpContextBase httpContextBase, IHttpRouteData route, YClass yProperty)
    {
        ((SessionUtils.SessionContent)httpContextBase.Session[GetSessionGUID(route)]).yProperty= yProperty;
    }
}

在Angular前端,我们只生成一个GUID,在启动项目时将其发送到后端并将其添加到我们发出的每个请求中。

public class TestController : ApiController
{
    private HttpContextBase _httpContext;

    public TestController ()
    {
         _httpContext = new HttpContextWrapper(HttpContext.Current);
    }
    public AuditTrailController(HttpContextBase context)
    {
        _httpContext = context;
    }

    [HttpGet]
    [Route("Send}")]
    public HttpResponseMessage Send()
    {
        XClass x = SessionUtils.GetSessionXProperty(_httpContext, Request.GetRouteData());
        HttpResponseMessage response = new HttpResponseMessage();
        response = Request.CreateResponse(HttpStatusCode.OK);
        response.Content = new StringContent(JsonConvert.SerializeObject(x), System.Text.Encoding.UTF8, "application/json");
        return response;
    }
}

然后在服务中:

window.name = UUID.UUID();