web-dev-qa-db-fra.com

La connexion sous-jacente a été fermée: la connexion a été fermée de manière inattendue.

Cette exception est systématiquement renvoyée sur une demande SOAP dont la réception prend presque trois minutes et dont la taille est de 2,25 Mo. 

En parcourant le Web, je trouve toutes sortes de messages qui semblent tous avoir pour objectif de définir des en-têtes dans la demande, certains veulent que je n'envoie pas l'en-tête "Expect:", d'autres veulent que j'envoie l'en-tête "Keep-Alive:", mais Quels que soient les en-têtes que j'envoie, je reçois toujours cette erreur embêtante. Je ne crois pas que définir des en-têtes soit ma réponse, car je peux recréer exactement la même requête en utilisant "curl" et une réponse revient finalement sans aucun problème

Mon <httpRuntime maxRequestLength="409600" executionTimeout="900"/>

Je me sens comme si je suis à court d'options. Si quelqu'un peut fournir une aide, je vous en serais très reconnaissant. Quelques autres choses à noter sont que le serveur sur lequel je demande des données est hors de ma portée, ces requêtes sont également transmises via https et les autres demandes avec des réponses plus petites fonctionnent parfaitement.

Merci

16
Dave

Vous avez étiqueté le message en tant que .NET35, utilisez-vous donc WCF? 

Si tel est le cas, voici un exemple du fichier App.config que nous utilisons pour les grands ensembles de données:

<system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647">
          <readerQuotas maxDepth="32" maxStringContentLength="8388608" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
        </binding>
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://localhost:1602/EndPoint.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding" contract="IEndPointContract" name="EndPoint" behaviorConfiguration="EndpointBehaviour" />     
    </client>
    <behaviors>
      <endpointBehaviors>
        <behavior name="EndpointBehaviour">
          <dataContractSerializer maxItemsInObjectGraph="2147483647" />
        </behavior>
      </endpointBehaviors>
    </behaviors>
  </system.serviceModel>
11
Robert Wagner

J'espère qu'il n'est pas trop tard pour répondre à cette question.

Essayez d'ajouter l'attribut suivant à la définition de votre interface de contrat: 

[ServiceKnownType(typeof(ReturnClass))]

Pour une solution plus générique permettant de retourner des classes polymorphes, veuillez vous reporter à ce message:  http://www.goeleven.com/blog/entryDetail.aspx?entry=45

6
Boris Modylevsky

Si vous utilisez dbml au lieu de edmx, vous obtiendrez ceci (la connexion sous-jacente a été fermée: la connexion a été fermée de manière inattendue.) Dbml ne retournant pas les données sérialisables dont il a besoin, vous devez donc avoir un contrat de données. .

4
sharmaja

J'ai le même problème, et après des recherches approfondies, j'ai trouvé cet article:

Blog de Merrick Chaffer

Tout était lié à la définition de "dataContractSerializer" pour le client et le serveur. J'espère que cela vous sera utile.

3
Ahmad Th

j'ai eu cette erreur parce que mes datatransfereobjects se sont référés les uns aux autres de manière récursive.

Par exemple:

Client-> (a) -> Rating Rating-> (appartient à) -> Client

il faut donc supprimer les cycles.

[DataContract]
public class Rating
{
    private Customer _customer;
    //[DataMember] // <-  EITHER HERE 
    public Customer Customer
    {
        get { return _customer; }
        set { _customer = value; }
    }
}


[DataContract]
public class Customer
{
    private long _customerID;
    [DataMember]
    public long CustomerID
    {
        get { return _customerID; }
        set { _customerID = value; }
    }

    [DataMember] // <- OR HERE
    public Rating Rating
    {
        get { return _rating; }
        set { _rating = value; }
    }
}
3
aatdark

J'ai essayé plusieurs façons de supprimer ce message d'erreur jusqu'à ce que je trouve cette solution: http://kiranpatils.wordpress.com/2008/09/22/the-underlying-connection-was-closed-the -connection-was-close-inopinément-en-retournant-table-de-données-depuis-wcf-service/

Vous pouvez changer votre liste <> en DataSet. Je soupçonne que DataSet peut gérer beaucoup plus de données que la liste <>.

J'espère que ça aide.

3
SyntaxError

Avez-vous essayé la suggestion de ce blog post ? Le problème réside probablement dans l'implémentation de la pile TCP/HTTP de .NET.

3
mkoeller

J'ai ajouté un autre champ, mais je n'avais pas de jeu sur la propriété. C'était ma solution pour la même erreur.

[DataMember]
public bool HasValue
{
    get { return true; }
    set { }//adding this line made the solution.
}
2
Isaac

Il s'agit d'une erreur générique générée s'il y a une erreur interne.

Essayez d'ajouter le traçage ici: http://msdn.Microsoft.com/en-us/library/ms732023(v=vs.110).aspx

Vous verrez alors le journal complet.

1
Justin Clarke

Pour WCF avec EF, ajoutez simplement le code suivant dans la classe de contexte.

base.Configuration.ProxyCreationEnabled = false;

0
Roath So