IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

problème intermittent lors de l'appel à un web service REST en visual studio 2010


Sujet :

C#

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2012
    Messages : 2
    Points : 3
    Points
    3
    Par défaut problème intermittent lors de l'appel à un web service REST en visual studio 2010
    Bonjour tout le monde.
    j'ai besoin de votre aide pour résoudre mon probleme.
    en faite je suis entrain de réaliser des web service REST avec ASP.net,
    l'architecture de ma solution est la suivante:
    BLL ==> j'ai mis dedans mes fonctions comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
     public static List<transaction> getTransaction(string ID)
        {
            var query = from v in SMARTDBEntities.Instance.transactions
                        where v.compteID == ID
                        select v;
            if (query.Count() == 0) 
              {
                return null; 
              } 
            else 
              { 
                return query.ToList(); 
              }
     
        }
    DAL ==> j'ai utilisé ADO.NET ENtity DATA model pour créer mon model.edmx
    Entity ==> j'ai utilisé POCO generation code pour générer mes entités depuis ma base de donnés
    et dans la classe service.cs, j'ai mis mes web service comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    [OperationContract]
        [WebInvoke(Method = "GET",
               ResponseFormat = WebMessageFormat.Json,
               UriTemplate = "Service/transactions/{cptID}")]
        public List<transaction> getTransactions(string cptID)
        {
            return detailCompte.getTransaction(cptID);
        }
    Et pour que la classe transaction soit sérialisable, j'ai du mettre dans le constructeur du poco.context ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.ContextOptions.ProxyCreationEnabled = false;
    vu que poco génére automatiquement une classe proxy qui empeche la sérialisation des classes. (merci google )

    Maintenant quand j'invoque ce web service à partir de mon navigateur préférer (chrome) , un problème intermittent apparait: parfois ça fonctionne parfaitement et la plupart de temps ça ne fonctionne pas et me donne une erreur
    324 (net :: ERR_EMPTY_RESPONSE): le serveur ne renvoie aucune information.
    Avez vous une idée ?
    Merci de m'aider.

  2. #2
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Salut,

    ERR_EMPTY_RESPONSE c'est ce que dit ton navigateur? Tu n'as pas d'autres traces? Peux-tu nous donner le détail de l'objet "transaction"?

    Merci
    "Winter is coming" (ma nouvelle page d'accueil)

  3. #3
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2012
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    Salut Immobilis,
    merci de t'être intéressé à mon problème.
    le message exacte est :
    Aucune donnée reçue.
    Impossible d'afficher la page Web, car le serveur n'a envoyé aucune donnée.
    Voici quelques suggestions :
    Actualisez cette page Web ultérieurement.
    Erreur 324 (net::ERR_EMPTY_RESPONSE) : Le serveur a mis fin à la connexion sans envoyer de données.
    comme je t'ai dit, c'est intermittent, par exemple j'ai essayé tout à l'heure est ça fonctionnait mais maintenant ça ne fonctionne pas et ça m'affiche cette erreur.
    Les attributs de l'objet transaction sont :
    transactionID
    transactionIDDEST
    transactionDATE
    transactionMANTANT
    transactionNATURE
    compteID

    et la classe générer par poco est la suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
     
    //------------------------------------------------------------------------------
    // <auto-generated>
    //     This code was generated from a template.
    //
    //     Changes to this file may cause incorrect behavior and will be lost if
    //     the code is regenerated.
    // </auto-generated>
    //------------------------------------------------------------------------------
     
    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Collections.ObjectModel;
    using System.Collections.Specialized;
    using System.ServiceModel;
    using System.ServiceModel.Web;
     
    namespace PFE.entity
    { 
        public partial class transaction
        {
            #region Primitive Properties
     
     
            public virtual string transactionID
            {
                get;
                set;
            }
     
            public virtual string transactionIDDEST
            {
                get;
                set;
            }
     
            public virtual string transactionDATE
            {
                get;
                set;
            }
     
            public virtual Nullable<double> transactionMANTANT
            {
                get;
                set;
            }
     
            public virtual string transactionNATURE
            {
                get;
                set;
            }
     
            public virtual string compteID
            {
                get { return _compteID; }
                set
                {
                    try
                    {
                        _settingFK = true;
                        if (_compteID != value)
                        {
                            if (compte != null && compte.compteID != value)
                            {
                                compte = null;
                            }
                            _compteID = value;
                        }
                    }
                    finally
                    {
                        _settingFK = false;
                    }
                }
            }
            private string _compteID;
     
            #endregion
            #region Navigation Properties
     
            public virtual compte compte
            {
                get { return _compte; }
                set
                {
                    if (!ReferenceEquals(_compte, value))
                    {
                        var previousValue = _compte;
                        _compte = value;
                        Fixupcompte(previousValue);
                    }
                }
            }
            private compte _compte;
     
            #endregion
            #region Association Fixup
     
            private bool _settingFK = false;
     
            private void Fixupcompte(compte previousValue)
            {
                if (previousValue != null && previousValue.transactions.Contains(this))
                {
                    previousValue.transactions.Remove(this);
                }
     
                if (compte != null)
                {
                    if (!compte.transactions.Contains(this))
                    {
                        compte.transactions.Add(this);
                    }
                    if (compteID != compte.compteID)
                    {
                        compteID = compte.compteID;
                    }
                }
                else if (!_settingFK)
                {
                    compteID = null;
                }
            }
     
            #endregion
        }
    }
    je vais te donné aussi les détails du fichier web.config et global.asax.cs peut être que ça t'aidera à mieux visualisé mon projet:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    <?xml version="1.0"?>
    <configuration>
     
      <system.web>
        <compilation debug="true" targetFramework="4.0" />
      </system.web>
     
      <system.serviceModel>
        <serviceHostingEnvironment aspNetCompatibilityEnabled="true"
          multipleSiteBindingsEnabled="true" />
        <standardEndpoints>
          <webHttpEndpoint>
            <standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="true" />
          </webHttpEndpoint>
        </standardEndpoints>
      </system.serviceModel>
     
      <system.webServer>
        <modules runAllManagedModulesForAllRequests="true"/>
      </system.webServer>
     
      <connectionStrings>
        <add name="SMARTDBEntities" connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=PC-DE-ZIED\SQLEXPRESS;Initial Catalog=SMARTDB;Integrated Security=True;Pooling=False;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />
      </connectionStrings>
     
    </configuration>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Security;
    using System.Web.SessionState;
    using System.Web.Routing;
    using System.ServiceModel.Activation;
     
    namespace PFE
    {
        public class Global : System.Web.HttpApplication
        {
            protected void Application_Start(object sender, EventArgs e)
            {
                RouteTable.Routes.Add(new ServiceRoute("",
                           new WebServiceHostFactory(), typeof(Service)));
            }
     
            protected void Application_BeginRequest(object sender, EventArgs e)
            {
     
                HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
                HttpContext.Current.Response.Cache.SetNoStore();
     
                EnableCrossDmainAjaxCall();
            }
     
     
                    private void EnableCrossDmainAjaxCall()
            {
                HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");
                if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
                {
                    HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST");
                    HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept, X-Requested-With");
            //        HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000");
                    HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "10");
                    HttpContext.Current.Response.End();
                }
            }
        }
    }
    Merci encore une fois Immobilis

  4. #4
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Salut,

    Normalement, pour être visible dans un web service la classe doit avoir l'attribut "DataContractAttribute" et les membres "DataMember". Ce n'est pas le cas chez toi apparemment. Peut-être peux-tu commencer par ça?

    Peut-on avoir le détail de l'objet "compte"?

    Je me demande si les types valeur "nullables" ne peuvent pas poser problème. J'ai un mauvais souvenir avec une énumération qui n'était pas initialisée et provoquait cette erreur. Vérifie si la valeur de "transactionMANTANT" quand l'erreur se produit.

    Le problème survient-il aussi quand tu testes le service avec WcfTestClient.exe?

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Immobilis Voir le message
    Normalement, pour être visible dans un web service la classe doit avoir l'attribut "DataContractAttribute" et les membres "DataMember". Ce n'est pas le cas chez toi apparemment. Peut-être peux-tu commencer par ça?
    Pas nécessairement obligatoire. Je pense qu'avec WCF on peut utiliser directement les classes comme type de retour ou comme paramètres des opérations de services sans pour autant que ces classes soient décorées des attributs DataContract et DataMember. Utile quand on travaille avec des classes POCO et qu'on ne veut en aucun cas polluer ces classes en utilisant des namespaces qui en casseraient le but. ça s'appelle les "Inferred Data Contracts". WCF ajoutera automatiquement l'attribut DataContract et aussi l'attribut DataMember à tous les membres publiques (champs ou propriétés).

  6. #6
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Je n'utilise pas POCO je ne pourrais pas argumenter dessus. A mon avis, dans tous les cas, il vaut mieux être toujours explicite: http://msdn.microsoft.com/en-us/libr...attribute.aspx
    Apply the DataMemberAttribute attribute in conjunction with the DataContractAttribute to identify members of a type that are part of a data contract. One of the serializers that can serialize data contracts is the DataContractSerializer.

    The data contract model is an "opt-in" model. Applying the DataMemberAttribute to a field or property explicitly specifies that the member value will be serialized. In contrast, the BinaryFormatter serializes public and private fields of a type, and the XmlSerializer serializes only public fields and properties of a type.
    En pratique, si tu crées un projet WCF VS créé des classes et des interfaces pour servir de modèle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    [DataContract]
    public class CompositeType
    {
        bool boolValue = true;
        string stringValue = "Hello ";
     
        [DataMember]
        public bool BoolValue
        {
            get { return boolValue; }
            set { boolValue = value; }
        }
     
        [DataMember]
        public string StringValue
        {
            get { return stringValue; }
            set { stringValue = value; }
        }
    }
    En testant le service avec WcfTestClient.exe il suffit de retirer l'attribut DataMember d'une des propriétés pour qu'elle ne soit plus visible par le client.

    En parcourant le web à ce sujet, on tombe sur des citations de Juval Löwy qui a écrit "Programming WCF Services: Mastering WCF and the Azure AppFabric Service Bus". Il dit entre autres choses
    In my opinion, relying on inferred data contracts is a sloppy hack that goes against the grain of most everything else in WCF. Much as WCF does not infer a service contract from a mere interface definition or enable transactions or reliability by default, it should not infer a data contract. Service orientation (with the exception of security) is heavily biased toward opting out by default, as it should be, to maximize encapsulation and decoupling. Do use the DataContract attribute, and be explicit about your data contracts. This will enable you to tap into data contract features such as versioning. The rest of this book does not use or rely on inferred data contracts.
    A+
    Images attachées Images attachées  
    "Winter is coming" (ma nouvelle page d'accueil)

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Immobilis Voir le message
    En testant le service avec WcfTestClient.exe il suffit de retirer l'attribut DataMember d'une des propriétés pour qu'elle ne soit plus visible par le client.
    D'accord avec toi Mais pour que cela marche il faut que la classe ne soit pas décorée de l'attribut DataContract et qu'aussi les propriétés soient publiques et pas décorées de l'attribut DataMember.

    Citation Envoyé par Immobilis Voir le message
    En parcourant le web à ce sujet, on tombe sur des citations de Juval Löwy qui a écrit "Programming WCF Services: Mastering WCF and the Azure AppFabric Service Bus". Il dit entre autres choses ...
    Je suis totalement d'accord avec lui (J'ai son bouquin et là que j'ai appris les inffered data contracts ) et je n'ai pas dit que c'était une bonne pratique. Mais cette technique peut être utile si on veut faire du pur POCO en utilisant les assemblys et les namespaces de base

  8. #8
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Et si tu testes sur un service web très simple (celui généré automatiquement par visual studio). Que ce passe-t-il?
    "Winter is coming" (ma nouvelle page d'accueil)

Discussions similaires

  1. Importer un Web Service Java dans Visual Studio 2010
    Par gjeanne dans le forum Développement Sharepoint
    Réponses: 2
    Dernier message: 12/03/2012, 17h32
  2. [wss3] Erreur 401 lors de l'appel du web service en c#
    Par nosdo dans le forum Développement Sharepoint
    Réponses: 10
    Dernier message: 06/07/2010, 16h09
  3. Réponses: 2
    Dernier message: 23/05/2008, 16h06
  4. utiliser un web service php avec Visual Studio
    Par <% Bastien %> dans le forum Services Web
    Réponses: 6
    Dernier message: 15/03/2008, 17h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo