【问题标题】:WCF call causing memory leakWCF 调用导致内存泄漏
【发布时间】:2011-07-05 22:51:50
【问题描述】:

WCF 服务调用存在内存泄漏问题。在我们的研究中,我们认为我们正确地调用了服务并适当地处理了从它返回的错误。我们甚至通过从 MS 网站获得的 MSDN 文章和示例 WCF 代码证实了这一点。

这是导致泄漏的代码示例。在 SaveAssociation 调用中,另一端的代码会引发异常。这会导致通道进入故障状态。第一个 catch 语句捕获异常 (SystemException) 并在客户端上调用 Abort(),这应该立即中止会话并关闭客户端连接。然而,看着这个进程在循环中一遍又一遍地运行这段代码,我们只会看到进程使用的内存不断攀升。

var client = new FrameworkServiceReference.MAServiceClient();

// Get User domain name
client.ClientCredentials.UserName.UserName = "username";
client.ClientCredentials.UserName.Password = "password";

OperationContextScope a1 = new OperationContextScope(client.InnerChannel);
MessageHeader<string> customHeaderAppID = new MessageHeader<string>("Account Management");
System.ServiceModel.Channels.MessageHeader a2 = customHeaderAppID.GetUntypedHeader("application", "http://www.ma.com");
OperationContext.Current.OutgoingMessageHeaders.Add(a2);

try
{
            client.SaveAssociation(association);
            client.Close();
}
catch (SystemException se)
{
            client.Abort();
}
catch (Exception ex)
{
            client.Abort();
}

这是我们收到的错误...

System.ServiceModel.FaultException`1[System.ServiceModel.ExceptionDetail]: Object reference not set to an instance of an object. (Fault Detail is equal to An ExceptionDetail, likely created by IncludeExceptionDetailInFaults=true, whose value is:
System.NullReferenceException: Object reference not set to an instance of an object.
   at Multiview.Business.Core.CoreObject.ValidateItem(String Item, String Value)
   at Multiview.Business.Core.User.UpdateUser()
   at Multiview.Business.Core.User.Save()
   at Multiview.Core.ServiceLibrary.MultiviewService.SaveCRMUser(User user, Guid CRMGuid)
   at SyncInvokeSaveCRMUser(Object , Object[] , Object[] )
   at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs)
   at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc)
   at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc)
   at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc& rpc)
   at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage3(MessageRpc& rpc)
   at System.ServiceMode...).

可以做些什么来阻止这种泄漏?

【问题讨论】:

    标签: wcf memory-leaks


    【解决方案1】:

    如果服务器上的内存增加,请检查服务器日志。您返回的对象可能具有循环引用。这意味着当它返回时,服务器在序列化对象时会抛出堆栈溢出。

    尝试使用以下方式配置您的服务:

    IncludeExceptionDetailInFaults=true
    

    并创建一些日志(服务器端和客户端):

    <system.diagnostics>
    <sources>
      <source name="System.ServiceModel" switchValue="Error, ActivityTracing" propagateActivity="true">
        <listeners>
          <add name="xml" />
        </listeners>
      </source>
      <source name="CardSpace">
        <listeners>
          <add name="xml" />
        </listeners>
      </source>
      <source name="System.IO.Log">
        <listeners>
          <add name="xml" />
        </listeners>
      </source>
      <source name="System.Runtime.Serialization">
        <listeners>
          <add name="xml" />
        </listeners>
      </source>
      <source name="System.IdentityModel">
        <listeners>
          <add name="xml" />
        </listeners>
      </source>
    </sources>
    <sharedListeners>
      <add name="xml" type="System.Diagnostics.XmlWriterTraceListener" initializeData="C:\t\mylog.svclog" />
    </sharedListeners>
    </system.diagnostics>
    

    【讨论】:

      【解决方案2】:

      如果您遇到内存泄漏问题,您应该从一些内存分析器开始,找出哪些对象存在于您的内存中。这将导致您进入泄漏源。

      您可以从 OperationContextScope 是一次性的这一事实开始。

      【讨论】:

      • 宾果游戏,OperationContextScope 是问题所在。我使用 using 重构了代码来创建该对象,一切都很好。感谢您的帮助!
      猜你喜欢
      • 2017-01-13
      • 1970-01-01
      • 2015-10-18
      • 2015-07-06
      • 2014-06-07
      • 2013-11-20
      • 2011-10-28
      • 2016-01-18
      • 2012-12-13
      相关资源
      最近更新 更多