C# WCF Castle客户端代理使通道保持打开状态

C# WCF Castle客户端代理使通道保持打开状态,c#,asp.net-mvc,wcf,castle,C#,Asp.net Mvc,Wcf,Castle,我正在使用Castle WCF Facility使用以下配置初始化客户端代理: <component id="ComponentID" type="SomeType, SomeType" wcfEndpointConfiguration="WCFConfig" lifestyle="PerWebRequest" > </component> 我遇到的问题是,在live中,我最终会出现大量内存泄漏。在使用内存分析器进行分析后,我似乎在内存中保留了大量WCF通道

我正在使用Castle WCF Facility使用以下配置初始化客户端代理:

  <component
 id="ComponentID"
 type="SomeType, SomeType"
 wcfEndpointConfiguration="WCFConfig"
 lifestyle="PerWebRequest" >
</component>

我遇到的问题是,在live中,我最终会出现大量内存泄漏。在使用内存分析器进行分析后,我似乎在内存中保留了大量WCF通道。我期望Castle WCF Facility在web请求结束时对此进行清理,对吗?

如果您使用lifestyle perwebrequest,则需要确保不会在整个请求过程中重新创建HttpContext。如果是,那么您需要传递HttpContext。作为Castle http模块的项目使用它来跟踪组件

e、 g

更改为:

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;
    }

您注册温莎HTTPM模块了吗?