2011-07-05 51 views
1

メモリをリークしているWCFサービス呼び出しに問題があります。私たちの研究では、サービスを正しく呼び、それから適切に戻ってくるエラーを処理していると考えています。 MSウェブサイトから取得したMSDNの記事とサンプルの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> 
関連する問題