2016-07-08 13 views
0

私は基本Web UIプロジェクトを持っていますが、他のMVC Webアプリケーションである他の「プラグイン」プロジェクトもあります。Session_Start複数回起動

私はそれらからdllのとビューを取って、私のメインのUIのビンとビューフォルダにそれらを投げるので、彼らはちょうど追加または削除することができますいつでも動作します。

各 'プラグイン'には、メインのWeb UIから呼び出されて、それぞれの 'プラグイン'からメニューオプションを読み込むGETメソッドが含まれています。各URLが呼び出された後

、メインのWeb UIはhtml = new WebClient().DownloadString(string.Format("{0}/{1}/GetMenu", currentDomain, controllerName));を呼び出して、どのように私は起きてからということを防止することができたときにSESSION_STARTが発火する原因は何 `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; 
    } 

を発射しますか?

これは、私がDLLとビューを他のプロジェクトから直接メインWeb UIプロジェクトにドロップするだけですが(「UI」に正しくロードされますが)、簡単に追加および削除できます?主な理由は、このの

答えて

1

その:

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

この行は、HTMLを取得するために、WebClientクラスを使用しますが、WebClientクラスはステートレスであり、各時間は、その呼ばれ、それはなしクッキーと別の要求を使用するため、サーバー新しい要求とみなし、新しいセッションを開始します。

+0

この呼び出しを行うにはどうすればよいでしょうか? – Tsukasa

+0

これは実際には多くのことに依存しています、asp.netアプリケーションと同じドメインにreqeustsを送信するフォームがありますか?あなたが今のように直接呼び出して使用するのではなく、WebClientリクエストに含まれるすべてのクッキーを転送するオプションもありますが、それはむしろ悪い方法です。 – MoustafaS

+0

他の「プラグイン」には参照がありませんメインのWeb UI。 Webuiはcompany.webuiです。プラグインはcompany.module.nameofmoduleです。 – Tsukasa

1

WebClient要求が再帰的に新しいセッションを開始しています。ハックとして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をデコレートすると、(GetMenu()がセッション状態を使用しない場合)Session_Startが完全に回避される場合があります。

+0

'plugins'の作業で '[SessionState(System.Web.SessionState.SessionStateBehavior.Disabled)]'を使用すると完璧です。私がここでやっていることで、このようなものを実装するのは適切な方法ですか、それとも非常に多くの方法でタスクを行うので悪い習慣です。 – Tsukasa

+0

私は以下のMoustafaSに同意します。私はしようとRenderViewToString()を使用して(ここに実装されてhttp://stackoverflow.com/a/2759898/154355)。これにより、http要求が回避され、パフォーマンスが向上します。 GetMenu()はセッション状態を使用しないため、Application_Startで一度レンダリングし、Session_Startでキャッシュされたバージョンを使用することもできます。 –

+0

メインWeb UIはGetMenuを含む他のコントローラを認識しないので、GetMenuアクションと同様にコントローラ名を文字列として渡す必要があります。それを変更する方法はありますか? – Tsukasa

関連する問題