2016-07-08 2 views
0

У меня есть базовый проект ui, у меня также есть другие проекты с плагинами, которые являются просто другими веб-приложениями mvc.Запуск Session_Start несколько раз

Я беру DLL и виды из них и бросаю их в папку с моим основным веб-сайтом ui и просматривает папку, чтобы их можно было просто добавить или удалить в любое время, когда это работает.

Каждый «плагин» содержит метод GET, который вызывается из основного веб-сайта ui для загрузки параметров меню из каждого из «плагинов».

После каждого URL называется, основной веб-интерфейс запускает `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 и виды из другого проекта непосредственно в главные веб-проекты ui как «плагин» (который, однако, правильно загружается в мой пользовательский интерфейс), который можно легко добавить и удалить ?

ответ

1

Его главным образом из-за этого:

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

Эта линия использует класс WebClient, чтобы получить HTML, но класс WebClient является лицом без гражданства, и каждый раз, когда его называют использует другой запрос, не печенье, поэтому сервер думает, что это новый запрос, и начинает новый сеанс.

+0

Что было бы лучшим способом сделать этот звонок? – Tsukasa

+0

На самом деле это зависит от множества вещей, вроде форм, отправляющих reqeusts в том же домене, что и приложение asp.net? то лучше всего было бы позвонить напрямую, а не использовать его так же, как сейчас, у вас есть возможность пересылки всех файлов cookie с запросом WebClient, но это будет довольно плохой метод. – MoustafaS

+0

Другие «плагины» не имеют ссылки на главная сеть ui. Webui является company.webui плагины являются company.module.nameofmodule – Tsukasa

1

Запрос WebClient рекурсивно запускает новый сеанс. В качестве взлома вы можете изменить свой Session_Start(), чтобы проверить, является ли входящий url/{controller}/GetMenu и просто избегает вызова WebClient. См.: https://stackoverflow.com/a/18656561.

В противном случае, возможно, украшение вашего MenuController с помощью SessionStateAttribute (https://msdn.microsoft.com/en-us/library/system.web.mvc.sessionstateattribute(v=vs.118).aspx) может полностью исключить Session_Start (если GetMenu() не использует состояние сеанса).

+0

Идеально использовать '[SessionState (System.Web.SessionState.SessionStateBehavior.Disabled)]' в 'plugins' работает. С тем, что я здесь делаю, это правильный способ реализовать что-то подобное или это плохая практика, поскольку существует так много способов сделать задачу. – Tsukasa

+0

Я согласен с MoustafaS ниже. Я бы попытался использовать RenderViewToString() (как это реализовано здесь http://stackoverflow.com/a/2759898/154355). Это позволит избежать запроса HTTP и повысить производительность. Поскольку GetMenu() не использует какое-либо состояние сеанса, его также можно будет отобразить один раз в Application_Start и использовать кешированную версию в Session_Start? –

+0

Главное web ui не знает о других контроллерах, которые содержат GetMenu, поэтому мне нужно будет передать имя контроллера как строку, а также действие GetMenu. Есть ли способ изменить его, чтобы сделать это? – Tsukasa