我有一个基础网络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中)以便轻松添加和删除?
答案 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()没有使用会话状态)。