2016-10-04 2 views
0

PowerShellセッションを維持するクラスがあります。私は新しいセッションを作成することなくpowershellセッションにアクセスできます。以下は私のスニペットコードHttpContext.Current.Session keep returnオブジェクト参照がクラスのオブジェクト(MVC 5)のインスタンスに設定されていません

public class PowerShellSession : IHttpHandler, IRequiresSessionState 
{ 
    public bool IsReusable 
    { 
     get 
     { 
      return false; 
     } 
    } 

    public void ProcessRequest(HttpContext context) 
    { 
     throw new NotImplementedException(); 
    } 

    public PowerShell PowerShell2010() 
    { 
     if(HttpContext.Current.Session == null) 
     { 
      WSManConnectionInfoSession connExch = new WSManConnectionInfoSession(); 

      var session = connExch.GetExchangeConnectionSession(2010); 

      Runspace runspace = RunspaceFactory.CreateRunspace(session); 
      runspace.Open(); 
      PowerShell Shell = PowerShell.Create(); 
      Shell.Runspace = runspace; 
      HttpContext.Current.Session["PowerShell2010"] = Shell; 

      return Shell; 
     } 
     if (HttpContext.Current.Session["PowerShell2010"] != null) 
     { 
      WSManConnectionInfoSession connExch = new WSManConnectionInfoSession(); 

      var session = connExch.GetExchangeConnectionSession(2010); 

      Runspace runspace = RunspaceFactory.CreateRunspace(session); 
      runspace.Open(); 
      PowerShell Shell = PowerShell.Create(); 
      Shell.Runspace = runspace; 
      HttpContext.Current.Session["PowerShell2010"] = Shell; 

      return Shell; 
     } 
     else 
     { 
      return (PowerShell)HttpContext.Current.Session["PowerShell2010"]; 
     }  

    } 
} 

は問題は常に私がセッションに値を設定しようとすると、「オブジェクトのインスタンスに設定されていないオブジェクト参照」を返す私のコードです。ここで

HttpContext.Current.Session["PowerShell2010"] = Shell; 

セッション

に値を設定するコードは、私が何か間違ったことをしましたか?

+0

'HttpContext.Current.Session'は辞書ですか?ウォッチを追加するように設定し、 'Shell'に設定しようとする前に値が何であるかを確認する必要があります。 – Gavin

+0

セッションが設定されていないことがあります。 'HttpContext.Current.Session'が' null'の場合、最初のif条件が入ります。プロパティにセッションを割り当てずに、「null」であることが証明されたときにアクセスしようとする – Nkosi

答えて

1

Powershellを使った経験はありません。あなたのif()ステートメントが間違っているということが問題の大きな部分を占めているようです。

まず、if(HttpContext.Current.Session == null)をチェックします。セッションオブジェクトが現在のコンテキストで見つからない場合はTRUEになります。しかし、あなたは、とにかく、そのセッションオブジェクトを使用しようとすることによって進むので、あなたが得ているエラーを取得するのも不思議ではありません。

次のものも正しくありません:if (HttpContext.Current.Session["PowerShell2010"] != null)これは以前のPowershellオブジェクトの格納に成功した場合はTRUEになります。しかし、新しいPowershellオブジェクトを作成して保存することになります。これは、明らかに必要と思われるキャッシュを完全に無効にします。最初にSessionオブジェクトにアクセスする方法があると仮定して、これを== nullに置き換える必要があります。 HTTPセッションオブジェクトに取得するための大きなチャンスが持っている

そして最後にではなく、少なくとも、:セッション状態は、Webサーバーおよび/またはweb.configファイルで有効になっていることを確認してください

  • を。
  • 上記のコードを、タイプライブラリクラスなどではなく、MVCコントローラクラスで実行します。または、MVC Controller ActionメソッドからHTTPセッションオブジェクトを、パラメータを使用してタイプライブラリメソッドに渡します。
関連する問題