我们正在构建一个Web应用程序,允许用户打开使用此应用程序创建的不同项目。前端是一个带有REST架构的Angular 4应用程序,后端是一个C#Asp.net Web Api。
我们的问题是我们将所有后端数据存储在一个Session中(因为它是一个包含数学数据和公式的巨大对象),当我们在不同的选项卡中打开多个项目时,会话在每个选项卡之间变得相同它会造成干扰。
我们正在尝试找到一种方法,将app的每个实例(每个项目)与服务器中的唯一会话相连。我们寻找使用存储在window.name
中的GUID作为每个选项卡,然后发送到存储我们对象的HttpContext.Current.Session["GUIDSessionID"];
的服务器,但我们没有找到使它工作的方法,因为我们是c#的初学者发展。
以下是我们寻找解决方案的链接(没有成功):
提前致谢。 尼古拉斯
答案 0 :(得分:0)
生成一个唯一的会话ID哈希或其他东西。 在Angular中存储它可以放置locale localStorage.setItem(' GUIDSessionID',' YourSessionID');。
如果你想在刷新localStorage.getItem之后得到它(' GUIDSessionID');
如果您使用新的生成新的SessionID登录,请删除旧的localStorage.removeItem(' GUIDSessionID')并设置新的。
答案 1 :(得分:0)
实现这一目标的最简单方法是 -
例如,如果您的项目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();