在ASP.NET MVC应用程序中设置会话持续时间在web.config中不起作用 [英] Setting session duration in ASP.NET MVC application doesn't work in web.config

查看:40
本文介绍了在ASP.NET MVC应用程序中设置会话持续时间在web.config中不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

定义问题

我发现有两种方法可以在ASP.NET MVC应用程序中设置会话持续时间:

  1. 正在为web.config文件的<sessionState>字段中的timeout属性设置值。
  2. Global.asax.cs文件的Session_Start()方法中设置Session.Timeout属性。

web.config文件按the document实现时,第一种方法不起作用,我得到HTTP 404错误:

<configuration>
    <system.web>
        <sessionState mode="InProc" cookieless="true" timeout="60" />
    </system.web>
</configuration>

但是,第二种方法在Global.asax.cs文件中实现时的工作方式如下:

public class ApplicationName : System.Web.HttpApplication
{
    protected void Session_Start(object sender, EventArgs e)
    {
        /* Sets the session duration to 60 minutes. */
        Session.Timeout = 60;
    }
}

错误代码通知

当我使用第一种方法时,在/Login/Index页面上单击";登录&按钮时出现HTTP 404错误。因为虽然输入了正确的用户名和密码,但页面会被重定向到/{token}/Login/LoginControl页面,而页面应该被重定向到/Profile页面。我不知道这种行为是如何发生的。

相关源代码

LoginController.cs文件中的相关方法和Login/Index.cshtml文件中定义的脚本如下:

public class LoginController : PublicController
{
    private readonly IUserService _userService;
    private readonly IUnitOfWork _uow;
    private SessionContext _sessionContext;

    public LoginController(IUnitOfWork uow, IUserService userService) : base(uow)
    {
        _uow = uow;
        _userService = userService;
        _sessionContext = new SessionContext();
    }

    [HttpPost]
    public ActionResult LoginControl(ELoginDTO login)
    {
        var result = _userService.GetUserByUserName(login.UserName, login.Password);

        if (result != null)
        {
            AutoMapper.Mapper.DynamicMap(result, _sessionContext);
            Session["SessionContext"] = _sessionContext;

            return Json("/Profile", JsonRequestBehavior.AllowGet);
        }
        else
        {
            return Json("", JsonRequestBehavior.AllowGet);
        }
    }
}

单击登录按钮将触发FUNCTION_LoginControl()脚本:

function FUNCTION_LoginControl()
{
    var model = { UserName: $("#inputUserName").val(), Password: $("#inputPassword").val() };

    if (model.UserName.trim() != "" && model.Password.trim() != "") 
    {
        $.ajax({
            url: "/Login/LoginControl",
            type: "POST",
            data: model,
            success: function (e) {
                if (e != "") 
                {
                    window.location = e;
                }
            }
        });
    }
}

推荐答案

我发现,当框架的<sessionState>字段中的cookieless属性设置为True时,会向URL添加一个唯一的ID。因此,我意识到,当我单击&登录&按钮时,我收到了一个错误,因为帖子转到了/{unique-id}/Login/LoginController,而它本应该转到/Login/LoginController

解决此问题的方法是将Web.config文件中sessionState中的cookieless字段设置为false

<!-- HttpPost request if "false" is added to the "cookieless" attribute -->
<!-- HttpPost Request: "/Login/LoginController"                         -->
<sessionState mode="InProc" cookieless="false" timeout="60" />

<!-- HttpPost request if "true" is added to the "cookieless" attribute  -->
<!-- HttpPost Request: "/{unique-id}/Login/LoginController"             -->
<sessionState mode="InProc" cookieless="true" timeout="60" />

这篇关于在ASP.NET MVC应用程序中设置会话持续时间在web.config中不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆