我试图搞清楚MVC框架,所以请耐心等待.
现在,我唯一使用会话存储的是存储当前登录的用户.我的网站很简单.对于此示例,请考虑三个域对象:Person,Meeting和File.用户可以登录并查看会议的"仅限会员"个人资料,并可以向其添加文件,或查看会议的公共"个人资料"(如果他们未登录).
因此,从会议的私人资料中,登录用户,我有一个"添加文件"链接.此链接路由到FileContoller.Add(int meetingId).通过此操作,我获得了用户希望使用会议ID添加文件的会议,但在发布表单后,我仍然需要知道用户正在向哪个会议添加文件.这就是我的问题所在,我应该通过TempData传递"当前正在与之交互"会议,还是将其添加到会话存储中?
这就是我目前的添加操作设置,但它不起作用:
public ActionResult Add(int meetingId)
{
try
{
var meeting = _meetingsRepository.GetById(meetingId);
ViewData.Model = meeting;
TempData[TempDataKeys.CurrentMeeting] = meeting; /* add to tempdata here */
}
catch (Exception)
{
TempData[TempDataKeys.ErrorMessage] = "Unable to add files to this meeting.";
return RedirectToRoute("MeetingsIndex");
}
return View();
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Add(FormCollection form)
{
var member = Session[SessionStateKeys.Member] as Member;
var meeting = TempData[TempDataKeys.CurrentMeeting] as Meeting; /* meeting ends up null here */
if (member == null)
{
TempData[TempDataKeys.ErrorMessage] = "You …Run Code Online (Sandbox Code Playgroud) 在ASP.NET站点中使用会话时,几乎在同一时间加载多个请求时会导致严重的延迟(500毫秒的倍数).
我们的网站专门为其SessionId使用会话.我们使用此密钥来查找具有用户信息等的db表.这似乎是一个很好的设计,因为它存储了最少的会话数据.不幸的是,如果你在会话中没有任何东西,SessionId会改变,所以我们存储Session["KeepId"] = 1;.这足以说服SessionId不要改变.
在一个看似无关的说明中,该网站通过控制器操作提供定制的产品图像.如果需要,此操作会生成图像,然后重定向到缓存的图像.这意味着一个网页可能包含图像或其他资源,通过ASP.NET管道发送数十个请求.
无论出于何种原因,当您(a)同时发送多个请求并且(b)以任何方式涉及会话时,您将最终获得大约1/2时间的随机500ms延迟.在某些情况下,这些延迟将是1000毫秒或更长,总是以~500毫秒的间隔增加.更多请求意味着更长的等待时间 对于某些图像,我们包含数十张图像的页面可能需要等待10秒以上.
创建一个空的控制器动作:
public class HomeController : Controller
{
public ActionResult Test()
{
return new EmptyResult();
}
}
Run Code Online (Sandbox Code Playgroud)创建一个test.html页面,其中包含一些符合该操作的img标记:
<img src="Home/Test?1" />
<img src="Home/Test?2" />
<img src="Home/Test?3" />
<img src="Home/Test?4" />
Run Code Online (Sandbox Code Playgroud)运行页面并观察firebug中的快速加载时间:

执行以下操作之一(两者都具有相同的结果):
向Global.asax.cs添加一个空的Session_Start处理程序
public void Session_Start() { }
Run Code Online (Sandbox Code Playgroud)把东西放在会议中
public class HomeController : Controller
{
public ActionResult Test()
{
HttpContext.Current.Session["Test"] = 1;
return new EmptyResult();
}
}
Run Code Online (Sandbox Code Playgroud)再次运行该页面并注意响应中的偶然/随机延迟.

有没有办法指定给定的Controller或Action以只读方式使用Session状态?在"旧"ASP.NET中我们曾经做过类似的事情:
<%@ Page EnableSessionState="ReadOnly" %>
Run Code Online (Sandbox Code Playgroud)
是否有ASP.NET MVC等效?我希望允许我的应用程序同时处理来自同一客户端的多个请求,完全关闭会话在我的情况下不是一个选项.
我们正在构建一个ASP.NET MVC应用程序,该应用程序将部署在硬件负载平衡器后面,该负载平衡器支持缓存等.
我们的建议是手动定义负载均衡器应缓存哪些URL模式.这对我们来说是一个非常简单的过程,因为我们的"目录"页面是相对静态的,然后是"订单"页面,而不是.
必须避免在缓存页面上使用会话状态,因为负载均衡器会缓存整个响应 - 这包括发送的任何cookie.
理想情况下,会有一个属性可以应用于控制器或动作方法,允许选择性地使用会话状态,但似乎没有.我意识到,如果使用离开"会话区域",这样的方法会导致会话丢失 - 这很好.
除了重新实现整个ASP.NET MVC HTTP控制器...任何建议?
提前致谢.
我正在努力取得进步.在服务器端,我创建了一个控制器,它应该获取进度值并将值存储在会话中.
在客户端,我创建了两个ajax请求.其中一个启动一个函数,我想监视它,另一个只是检查进度阶段.我的意思是,这就是我认为它会起作用的方式.但它只会在完成后输出一些东西.
它只是等待几秒钟然后警告"完成!" 就这样.
有什么问题?也许我应该在控制器中创建新线程来监控进度阶段?
这是客户端代码:
function generate() {
setTimeout(checkProgress, 400);
$.ajax({
type: "POST",
url: "/PPTReport/Generate",
async: true,
success: function (text) {
console.log(text);
},
error:function() {
console.log("error! error!");
}
});
}
function checkProgress() {
var id = "reportProgress";
$.ajax({
type: "POST",
url: "/PPTReport/GetProgress",
async: true,
data: "id="+id,
success: function (data) {
if (data.done) {
console.log('Done!');
} else {
console.log('Progress at ' + data.percent + '%');
console.log(data.percent);
setTimeout(checkProgress, 100 );
}
},
error: function() {
console.log('ajax error');
}
});
}
Run Code Online (Sandbox Code Playgroud)
这是服务器端代码 …
asp.net-mvc ×6
session ×3
asp.net ×1
caching ×1
httpsession ×1
jquery ×1
progress-bar ×1
tempdata ×1
webforms ×1
zeus ×1