2011-12-06 6 views
0

を残します大きなメモリリークこれをメモリープロファイラーで分析した結果、多数のWCFチャンネルがメモリーに残っているようです。キャッスルWCFファシリティがウェブリクエストの最後にこれをきれいにすることを期待していますか?WCF城クライアントプロキシは、私は以下の構成を使用してクライアントプロキシを初期化するために城WCF施設を使用していますチャネルオープン

+0

あなたはウィンザーHttpModuleを登録しましたか?これを変更

Nexus

答えて

0

ライフスタイルperwebrequestを使用する場合は、リクエストを通じてHttpContextが再作成されないようにする必要があります。そうであれば、Castle HTTPモジュールがこれを使用してコンポーネントを追跡するので、HttpContext.Itemsを渡す必要があります。

これに

public CapturedViewResult Capture(ControllerContext controllerContext, Func<ActionResult> action) 
    { 
     CapturedViewResult capturedViewResult = new CapturedViewResult(); 

     HttpContext currentContext = HttpContext.Current; 

     using (StringWriter stringWriter = new StringWriter(CultureInfo.InvariantCulture)) 
     { 
      HttpResponse response = new HttpResponse(stringWriter); 
      HttpContext context = new HttpContext(currentContext.Request, response) { User = currentContext.User }; 
      context.Items["LocalizationContext"] = currentContext.Items["LocalizationContext"]; 

      HttpContext.Current = context; 

      ViewResult result = action.Invoke() as ViewResult; 

      if (result != null) 
      { 
       capturedViewResult.ViewName = result.ViewName; 
       result.ExecuteResult(controllerContext); 
      } 
      else 
      { 
       throw new ArgumentException("Supplied controller action method did not return a ViewResult", "action"); 
      } 

      HttpContext.Current = currentContext; 

      capturedViewResult.CapturedHtml = stringWriter.ToString(); 
     } 

     return capturedViewResult; 
    } 

public CapturedViewResult Capture(ControllerContext controllerContext, Func<ActionResult> action) 
    { 
     var capturedViewResult = new CapturedViewResult(); 

     var currentContext = HttpContext.Current; 

     using (var stringWriter = new StringWriter(CultureInfo.InvariantCulture)) 
     { 
      var response = new HttpResponse(stringWriter); 
      var context = new HttpContext(currentContext.Request, response) { User = currentContext.User }; 

      foreach (var key in currentContext.Items.Keys) 
      { 
       context.Items.Add(key, currentContext.Items[key]); 
      } 

      HttpContext.Current = context; 

      var result = action.Invoke() as ViewResult; 

      if (result != null) 
      { 
       capturedViewResult.ViewName = result.ViewName; 
       result.ExecuteResult(controllerContext); 
      } 
      else 
      { 
       throw new ArgumentException("Supplied controller action method did not return a ViewResult", "action"); 
      } 

      foreach (var key in context.Items.Keys) 
      { 
       currentContext.Items[key] = context.Items[key]; 
      } 

      HttpContext.Current = currentContext; 

      capturedViewResult.CapturedHtml = stringWriter.ToString(); 
     } 

     return capturedViewResult; 
    } 
関連する問題