2011-07-05 104 views
1

我們遇到內存泄漏的WCF服務調用問題。在我們的研究中,我們認爲我們正在調用服務並正確處理從其中回來的錯誤。我們甚至用MSDN文章和從MS網站獲得的示例WCF代碼證實了這一點。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...). 

可以做些什麼來阻止這種泄漏?

回答

1

如果你有記憶問題泄密,你應該用一些內存啓動探查器並查找哪些對象在您的記憶中。這會導致你泄漏的來源。

您可以從OperationContextScope是一次性的事實開始。

+0

賓果,OperationContextScope是問題。我用一個用於創建該對象的代碼重構了代碼,並且一切都很好。謝謝您的幫助!! –

2

如果服務器上的內存增加,請檢查服務器日誌。可能您返回的對象有一個循環引用。這意味着當它返回時,服務器在序列化對象時會引發堆棧溢出。

嘗試與配置服務:

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>