Session_Start多次触发

时间:2016-07-08 22:33:22

标签: c# asp.net-mvc

我有一个基础网络ui项目,我还有其他的插件'这些项目只是其他mvc Web应用程序。

我从他们那里获取dll和视图,然后将它们放入我的主网页文件夹和视图文件夹中,这样就可以随时添加或删除它们。

每个插件'包含从主网络ui调用的GET方法,用于从每个插件加载菜单选项。

在调用每个URL之后,主web ui将触发`Session_Start'

menu.Append(HelperMethods.GetModuleMenuHTML(controller, SecurityController.CurrentDomain()));

public static string GetModuleMenuHTML(string controllerName, string currentDomain)
    {
        string html = string.Empty;
        try
        {
            //THIS LINE HERE IS CAUSING Session_Start to fire again
            //IN THE MAIN WEB UI
            html = new WebClient().DownloadString(string.Format("{0}/{1}/GetMenu", currentDomain, controllerName));
        }
        catch (Exception ex)
        {

        }
        return html;
    }

调用html = new WebClient().DownloadString(string.Format("{0}/{1}/GetMenu", currentDomain, controllerName));时导致Session_Start触发的原因是什么?如何防止这种情况发生?

这是否与我有关只是将dll和其他项目中的视图直接放入主要的web ui项目作为"插件" (但是它可以正确加载到我的UI中)以便轻松添加和删除?

2 个答案:

答案 0 :(得分:1)

主要是因为:

html = new WebClient().DownloadString(string.Format("{0}/{1}/GetMenu", currentDomain, controllerName));

这一行使用WebClient类来获取html,但WebClient类是无状态的,每次调用它都使用另一个没有cookie的请求,因此服务器认为它是一个新请求,并启动一个新会话。

答案 1 :(得分:1)

WebClient请求以递归方式启动新会话。作为一个hack,您可以修改Session_Start()以检查传入的URL是否为/ {controller} / GetMenu并且只是避免WebClient调用。请参阅:https://stackoverflow.com/a/18656561

否则,使用SessionStateAttribute(https://msdn.microsoft.com/en-us/library/system.web.mvc.sessionstateattribute(v=vs.118).aspx)修饰MenuController可能会完全避免Session_Start(如果GetMenu()没有使用会话状态)。