【发布时间】:2018-01-23 19:25:19
【问题描述】:
我正在寻找有关我的问题的解决方案或最佳实践。因为它更像是一个架构挑战,所以我没有源代码......
我的问题是如何处理与我的要求有关的 ASP.NET 会话。还是不符合我的要求?
情况:我在 ASP.NET MVC 之上构建了一个 SinglePageApplication。 MVC-app 提供服务器端接口来处理后端。 MVC 应用程序调用不同后端服务器的服务来请求数据。这些数据可能很多,应该缓存在 MVC-app 中。
据我所知,ASP.NET 会话似乎不是 SPA 的最佳解决方案,因为它的并发行为......?!如果有任何请求需要对会话进行写访问(在我的情况下发生这种情况,因为必须缓存数据),则不可能有并发的 ajax 请求。
示例:至少在我的应用程序中,典型情况是,当用户访问某个屏幕时,会执行一些 ajax 请求。例如。第一个请求触发从后端服务器加载数据并需要一些时间(可能大约 30 秒......)。它还需要对会话进行写访问,因为它应该为这个(!)用户缓存数据。其他请求现在必须等待,即使它们只需要对会话进行读取访问并且不处理要加载的数据。一个请求等待另一个请求的行为应该只发生在某些情况下。
我现在可以使用 System.Runtime.Caching 实现不同的机制来为每个用户缓存数据,但这是推荐的还是最佳的解决方案?
处理这种情况的最佳模式是什么?
有什么最佳做法吗?
编辑2:
一个重要的点是执行并发 ajax 调用时会话的行为。我准备了一个小例子:一个执行 ajax 调用的应用程序 - 有些将会话用作 ReadOnly - 其他的则需要 ReadWrite。操作有超时问题更明显...
这些是我的控制器:
[SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)]
public class SessionReadOnlyController : Controller
{
public ActionResult Perform()
{
Session["x"] = 5;
Thread.Sleep(1500);
return Json(new { success = true }, JsonRequestBehavior.AllowGet);
}
}
[SessionState(System.Web.SessionState.SessionStateBehavior.Required)]
public class SessionReadWriteController : Controller
{
public ActionResult Perform()
{
Session["x"] = 5;
Thread.Sleep(1500);
return Json(new { success = true }, JsonRequestBehavior.AllowGet);
}
}
这是执行 ajax 调用的 javascript 代码。所有调用都会立即执行:
jQuery(function ()
{
$('body').append('<p>start....1</p>');
$.ajax({
url: '/SessionReadWrite/Perform?id=1',
success: function () { $('body').append('<p>success1</p>'); }
});
$('body').append('<p>start....2</p>');
$.ajax({
url: '/SessionReadWrite/Perform?id=2',
success: function () { $('body').append('<p>success2</p>'); }
});
$('body').append('<p>start....3</p>');
$.ajax({
url: '/SessionReadOnly/Perform?id=3',
success: function () { $('body').append('<p>success3</p>'); }
});
$('body').append('<p>start....4</p>');
$.ajax({
url: '/SessionReadOnly/Perform?id=4',
success: function () { $('body').append('<p>success4</p>'); }
});
$('body').append('<p>start....5</p>');
$.ajax({
url: '/SessionReadOnly/Perform?id=5',
success: function () { $('body').append('<p>success5</p>'); }
});
});
在我的案例中的结果(取自 internet-explorer 的开发者工具):
- 呼叫 1 在 1.51 秒后响应
- 呼叫 2 在 3.03 秒后响应
- 呼叫 3 在 4.56 秒后响应
- 呼叫 4 在 4.56 秒后响应
- 呼叫 5 在 4.56 秒后响应
据我了解,ReadWrite-Session-actions 甚至对于 ReadOnly-Session-actions 都锁定了会话...?! (或者我做错了什么?)
来自msdn (http://msdn.microsoft.com/de-de/library/ms178581%28v=vs.100%29.aspx),上一章:
[...] 但是,如果对同一个会话发出两个并发请求(通过使用相同的 SessionID 值),则第一个请求将获得对会话信息的独占访问权。第二个请求仅在第一个请求完成后执行。 [...] 但是,会话数据的只读请求可能仍需要等待会话数据的读写请求设置的锁定才能清除。
关于我的情况:如果我想在 SinglePageApplication 中缓存数据(内存中可以,因为该应用程序仅由少数用户使用),我需要与会话不同的概念......因此我的问题是最佳做法?
编辑:改进的情况描述...
Edit2:添加了一个示例...
【问题讨论】:
-
如果你不展示一些代码或以更好的方式解释你在做什么,没有人会帮助你。问题无法理解。
-
希望描述更好...
-
现在描述完美了。您必须进行一些自定义编码。我已经解释了如何使用伪代码来做到这一点。制作完整的工作样本太长了。
标签: ajax asp.net-mvc session single-page-application