相关疑难解决方法(0)

何时在ASP.Net MVC中使用TempData vs Session

我试图搞清楚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-mvc session tempdata

60
推荐指数
3
解决办法
7万
查看次数

在ASP.NET会话中存储任何内容会导致500毫秒延迟

问题:

在ASP.NET站点中使用会话时,几乎在同一时间加载多个请求时会导致严重的延迟(500毫秒的倍数).

更具体地说,我的问题

我们的网站专门为其SessionId使用会话.我们使用此密钥来查找具有用户信息等的db表.这似乎是一个很好的设计,因为它存储了最少的会话数据.不幸的是,如果你在会话中没有任何东西,SessionId会改变,所以我们存储Session["KeepId"] = 1;.这足以说服SessionId不要改变.

在一个看似无关的说明中,该网站通过控制器操作提供定制的产品图像.如果需要,此操作会生成图像,然后重定向到缓存的图像.这意味着一个网页可能包含图像或其他资源,通过ASP.NET管道发送数十个请求.

无论出于何种原因,当您(a)同时发送多个请求并且(b)以任何方式涉及会话时,您将最终获得大约1/2时间的随机500ms延迟.在某些情况下,这些延迟将是1000毫秒或更长,总是以~500毫秒的间隔增加.更多请求意味着更长的等待时间 对于某些图像,我们包含数十张图像的页面可能需要等待10秒以上.

如何重现问题:

  1. 创建一个空的ASP.NET MVC Web应用程序
  2. 创建一个空的控制器动作:

    public class HomeController : Controller
    {
      public ActionResult Test()
      {
        return new EmptyResult();
      }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 创建一个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)
  4. 运行页面并观察firebug中的快速加载时间:

    每张图片加载速度都相当快

  5. 执行以下操作之一(两者都具有相同的结果):

  6. 再次运行该页面并注意响应中的偶然/随机延迟.

    有些请求会遇到长时间延迟

我所知道的

  • 它发生在MVC 2&3和WebForms中
  • 它适用于任何浏览器(我们尝试过FF,Chrome,IE,Safari)
  • 无论是否附加调试器,都会发生这种情况 …

asp.net-mvc session webforms httpsession

34
推荐指数
2
解决办法
7597
查看次数

在ASP.NET MVC中指定只读会话

有没有办法指定给定的Controller或Action以只读方式使用Session状态?在"旧"ASP.NET中我们曾经做过类似的事情:

<%@ Page EnableSessionState="ReadOnly" %>
Run Code Online (Sandbox Code Playgroud)

是否有ASP.NET MVC等效?我希望允许我的应用程序同时处理来自同一客户端的多个请求,完全关闭会话在我的情况下不是一个选项.

asp.net-mvc session

23
推荐指数
2
解决办法
1万
查看次数

每个控制器/操作方法启用/禁用会话状态

我们正在构建一个ASP.NET MVC应用程序,该应用程序将部署在硬件负载平衡器后面,该负载平衡器支持缓存等.

我们的建议是手动定义负载均衡器应缓存哪些URL模式.这对我们来说是一个非常简单的过程,因为我们的"目录"页面是相对静态的,然后是"订单"页面,而不是.

必须避免在缓存页面上使用会话状态,因为负载均衡器会缓存整个响应 - 这包括发送的任何cookie.

理想情况下,会有一个属性可以应用于控制器或动作方法,允许选择性地使用会话状态,但似乎没有.我意识到,如果使用离开"会话区域",这样的方法会导致会话丢失 - 这很好.

除了重新实现整个ASP.NET MVC HTTP控制器...任何建议?

提前致谢.

asp.net-mvc caching session-state zeus

18
推荐指数
2
解决办法
2万
查看次数

没有会话状态的ASP.NET应用程序?

我刚刚看完了Stefan Schackow的PDC 2009 会议,他提到他很惊讶人们仍然在ASP.NET中使用Session State.会话状态甚至在ASP.NET MVC 内部使用.

使用遗留应用程序,其中所有内容都被放入"进程中"会话(甚至数据表!),我已经看到了第一手会话滥用.

有没有办法构建没有会话状态的ASP.NET应用程序?您将如何存储典型电子商务工作流程的每个步骤的信息?

asp.net asp.net-mvc session-state

5
推荐指数
2
解决办法
3339
查看次数

MVC进度条将无法正常工作

我正在努力取得进步.在服务器端,我创建了一个控制器,它应该获取进度值并将值存储在会话中.

在客户端,我创建了两个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 jquery progress-bar

5
推荐指数
1
解决办法
1282
查看次数