LINQ to sql exception : The underlying connection was closed...

LINQ to sql exception : The underlying connection was closed... - C#/.NET managed - Programmation

Marsh Posté le 18-05-2010 à 10:30:22    

Bonjour,
J'utilise un WebService LINQ to SQL qui effectue simplement une requete dans une base SQL Server.
 
L'exception récupérée est : "The underlying connection was closed: An unexpected error occurred on a receive"
 
Tout fonctionne lorsque la requete retourne peu d'enregistrements, et dans le cas ou elle retourne environ 5000 enregistrements, j'ai mon exception...
 
Voilà mon code côté WebService :

Code :
  1. public IList<MON_TYPE> getRetourRequete(param1, param2...)
  2.         {
  3.             string[] strListCustomerCode = param1.Split(';');
  4.             List<MON_TYPE> listMonType = null;
  5.             try
  6.             {
  7.                 using (monDataContext context = new monDataContext())
  8.                 {
  9.                     foreach (string strCustomCode in strListCustomerCode)
  10.                     {
  11.                         var result = from wo in context.MON_TYPE
  12.                                          where wo.monChamp1 == strCustomCode
  13.                                          where wo.monChamp1.Contains(param2)
  14.                                          where wo.monChamp1.Contains(param3)....
  15.                                          select wo;
  16.                    
  17.                         context.ObjectTrackingEnabled = false;
  18.                         if ((result.ToList<MON_TYPE>() != null) &&
  19.                             (result.ToList<MON_TYPE>().Count > 0))
  20.                         {
  21.                             if (listMonType == null)
  22.                             {
  23.                                 listMonType = new List<MON_TYPE>();
  24.                                 listMonType.AddRange(result.ToList<MON_TYPE>());
  25.                             }
  26.                             else
  27.                             {
  28.                                 listMonType.AddRange(result.ToList<MON_TYPE>());
  29.                             }
  30.                         }
  31.                     }
  32.                 }
  33.             }
  34.             catch (Exception ex)
  35.             {
  36.                 string mess = ex.Message;
  37.                 listMonType = null;
  38.             }
  39.             return listMonType;
  40.         }
  41.     }


Dans un 1er temps le param1 est splitté car il contient plusieurs valeurs pour le même champ. Ma requete est executé plusieurs fois avec ces valeurs et les résultats sont concaténés (c'est un "OU" à ma sauce)
 
côté consommateur du service :

Code :
  1. try
  2. {
  3.       Service monService = new Service();
  4.       IList<MON_TYPE> maList = monService.getRetourRequete(param1, param2...);
  5.       // c'est après ce code que le programme passe en exception coté client uniquement pas d'exception sur le service
  6. }
  7. catch (Exception ex)
  8. {
  9.       // exception récupérée (The underlying connection was closed...)
  10.       string message = ex.Message
  11. }


 
J'ai cherché tout hier, je ne trouve pas d'où ca peut venir, si quelqu'un a une idée ? Merci !


Message édité par katopex le 18-05-2010 à 14:15:37
Reply

Marsh Posté le 18-05-2010 à 10:30:22   

Reply

Marsh Posté le 18-05-2010 à 14:37:42    

Oui tu as bien très compris le problème ! (j'ai complété mon 1er post)
 
Et en plus grace à ca j'ai résolu mon problème.
 
Dans le fichier Traces.svclog le message était : « Le nombre maximal d’éléments pouvant être sérialisés ou désérialisés dans un graphique d’objet est « 65536 ». Modifiez le graphique d’objet ou augmentez le quota MaxItemsInObjectGraph.  »
 
Du coup j'ai cherché un peu et pour résoudre le problème il fallait préciser dans le web.config pour le "behavior" du service utilisé (dans mon cas : IntegAppsServiceBehavior) une valeur plus haute pour le paramètre MaxItemsInObjectGraph :  

Code :
  1. <system.serviceModel>
  2.  <behaviors>
  3.   <serviceBehaviors>
  4.    <behavior name="UsersServiceBehavior">
  5.     <serviceMetadata httpGetEnabled="true" />
  6.    </behavior>
  7.    <behavior name="IntegAppsServiceBehavior">
  8.     <serviceMetadata httpGetEnabled="true" />
  9.           <dataContractSerializer maxItemsInObjectGraph="100000" />
  10.    </behavior>
  11.   </serviceBehaviors>
  12.     </behaviors>
  13. </system.serviceModel>


 
Par contre je me demande comment être sur d'avoir une valeur qui fonctionne toujours pour ce paramètre (à moins de mettre une valeur très grande mais y a t-il des effets de bord ?...)
 
Merci beaucoup en tout cas pour cette rapide et excellente réponse !


Message édité par katopex le 18-05-2010 à 14:41:58
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed