ASP.NET MVC 5:使用Application Variable创建在线用户计数器

时间:2017-06-12 18:19:59

标签: c# asp.net asp.net-mvc

我遇到了一个可能是愚蠢的问题,但我只是看了看这些地方并且无法完成这项工作!

我创建了一个ASP.NET MVC Web应用程序,我想使用Application [“something”]来保存计数器以在线标记访问者。我在ASP.NET中做了几次这个过程,而不是在MVC ......

所以,在Global.asax上,我有以下代码

public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
        AreaRegistration.RegisterAllAreas();
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        HttpContext.Current.Application["totalVisitas"] = 0;
        HttpContext.Current.Application["visitasOnline"] = 0;
}

之后我创建了一个模型来使用这个数据,并且还创建了一个带有以下代码的Controller:

 public class OnlineStatsController : Controller
    {
        // GET: OnlineStats
        public ActionResult Index()
        {

        var modelOnline = new OnlineStatsViewModel
        {
            visitasOnline = (int)HttpContext.Application["visitasOnline"],
            totalVisitas = (int)HttpContext.Application["totalVisitas"]

        };
        return PartialView("UserStats",modelOnline);
    }
}

ViewModel代码:

public class OnlineStatsViewModel
    {
        public int totalVisitas { get; set; }

        public int visitasOnline { get; set; }


    }
}

最后,我有一个部分视图,其中包含以下代码:

@model  {namespace}.Models.OnlineStatsViewModel



    <h3>Visitas online: </h3>
    <p id="visitasOnline">@Model.visitasOnline</p>
    <h3>Total de Visitas: </h3>
    <p id="totalVisitas"><span class="badge">@Model.totalVisitas </span></p>

它由layout.cshtml调用

<body>
    @Html.Partial("_topBar")
    <div class="container body-content">
        @RenderBody()
        <hr />
        <footer>
            <div class="row">
                <div class="col-md-4">
                    <p>&copy; @DateTime.Now.Year -</p>
                </div>
                <div class="col-md-4">
                   @Html.Partial("UserStats",  new {namespace}.Models.OnlineStatsViewModel());
                </div>
            </div>
        </footer>
    </div>

    @Scripts.Render("~/bundles/jquery")
    @Scripts.Render("~/bundles/bootstrap")
    @RenderSection("scripts", required: false)
</body>

所有这一切,每次加载时,都会有0个在线用户和0个历史用户。我甚至试图对控制器中的值进行硬编码,使得像visitasOnline = 20000;但它只显示零...对不起,如果问题是愚蠢,我在MVC新手,并尝试在线几个课程,并得到这个问题=(

编辑---忘记写我更新的地方

在global.asax中,我还有以下内容:

 public void Session_Start(object sender, EventArgs e)
        {
            // Code that runs when a new session is started
            HttpContext.Current.Session["userName"] = "guest";
            HttpContext.Current.Application["visitasOnline"] = (int)HttpContext.Current.Application["visitasOnline"] +1;
            HttpContext.Current.Application["totalVisitas"] = (int)HttpContext.Current.Application["totalVisitas"] +1;
        }

        public void Session_End(object sender, EventArgs e)
        {
            // Code that runs when a session ends. 
            // Note: The Session_End event is raised only when the sessionstate mode
            // is set to InProc in the Web.config file. If session mode is set to StateServer 
            // or SQLServer, the event is not raised.
            HttpContext.Current.Session["userName"] = "";
            HttpContext.Current.Application["visitasOnline"] = (int)HttpContext.Current.Application["visitasOnline"] - 1;
        }
    }

1 个答案:

答案 0 :(得分:0)

由于有关会话商店的信息有限,出现此类问题的可能性可能是您可能遵循以下路径:

  1. 您编写代码以在调试应用程序一到两次后递增值。

  2. 由于您的会话可能尚未过期,因此在您稍后添加代码以增加值的位置时,不再调用Session_start。因此给出值 0

    要验证这是否是潜在问题,请通过在其他浏览器中打开应用程序网址强制应用再次致电Session_Start,或在sessionTimeout <中将Web.config设置为较低值/ p>

  3. 如果提供更多信息,我会改进这个答案,但我认为这可能是问题,因为你的代码应该和我一起工作