Session_Start多次发射
本文关键字:发射 Start Session | 更新日期: 2023-09-27 17:56:15
>我有一个基本的Web UI项目,我还有其他"插件"项目,这些项目只是其他mvc Web应用程序。
我从它们那里获取 dll 和视图,并将它们扔到我的主 web ui 的 bin 和视图文件夹中,以便可以随时添加或删除它们,这确实有效。
每个"插件"都包含一个GET方法,该方法从主Web UI调用,以从每个"插件"加载菜单选项。
调用每个 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;
}
是什么导致Session_Start在呼叫html = new WebClient().DownloadString(string.Format("{0}/{1}/GetMenu", currentDomain, controllerName));
时触发,我该如何防止这种情况发生?
这是否与我只是将另一个项目的 dll 和视图直接放入主 Web UI 项目中作为"插件"(但是它会正确加载到我的 UI 中)以便轻松添加和删除有关?
主要是因为这个:
html = new WebClient().DownloadString(string.Format("{0}/{1}/GetMenu", currentDomain, controllerName));
此行使用 WebClient 类来获取 html,但 WebClient 类是无状态的,每次调用它时,它都会使用另一个没有 cookie 的请求,因此服务器将其视为新请求,并启动新会话。
Web 客户端请求正在递归启动新会话。作为一种黑客,您可以修改您的 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() 不使用会话状态)。