Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 8 sur 8
  1. #1
    Candidat au titre de Membre du Club
    Inscrit en
    juillet 2009
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : juillet 2009
    Messages : 58
    Points : 13
    Points
    13

    Par défaut Problème MVC WEB API

    Bonjour à tous,

    J'ai un problème avec du code généré sur ASP.NET MVC 4 WEB API (.net 4.5)
    J'ai généré mon api controller avec un crud sur entity framework.

    lorsque j'appel http://localhost:49350/API/appelOffreAPI , je tombe sur ce message d'erreur :

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    <Error><Message>Une erreur s’est produite.</Message>
     
    <ExceptionMessage>Échec de la sérialisation du corps de la réponse par le type « ObjectContent`1 » pour le type de contenu « application/xml; charset=utf-8 ».</ExceptionMessage>
     
    <ExceptionType>System.InvalidOperationException</ExceptionType><StackTrace/><InnerException><Message>Une erreur s’est produite.</Message>
     
    <ExceptionMessage>Le type 'System.Data.Entity.DynamicProxies.appelOffre_6BD464C63E1E9FC18FA1B225FB275E245EE698BAB7172F027BB12C62A37D9872' avec le nom de contrat de données 'appelOffre_6BD464C63E1E9FC18FA1B225FB275E245EE698BAB7172F027BB12C62A37D9872:http://schemas.datacontract.org/2004/07/System.Data.Entity.DynamicProxies' n'est pas attendu. Utilisez un DataContractResolver ou ajoutez tous les types non connus statiquement à la liste des types connus, par exemple en utilisant l'attribut KnownTypeAttribute ou en les ajoutant à la liste des types connus qui est transmise à DataContractSerializer.</ExceptionMessage>
     
    <ExceptionType>System.Runtime.Serialization.SerializationException</ExceptionType><StackTrace>   à System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeAndVerifyType(DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, Boolean verifyKnownType, RuntimeTypeHandle declaredTypeHandle, Type declaredType)
       à System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeWithXsiType(XmlWriterDelegator xmlWriter, Object obj, RuntimeTypeHandle objectTypeHandle, Type objectType, Int32 declaredTypeID, RuntimeTypeHandle declaredTypeHandle, Type declaredType)
       à System.Runtime.Serialization.XmlObjectSerializerWriteContext.InternalSerialize(XmlWriterDelegator xmlWriter, Object obj, Boolean isDeclaredType, Boolean writeXsiType, Int32 declaredTypeID, RuntimeTypeHandle declaredTypeHandle)
       à WriteArrayOfappelOffreToXml(XmlWriterDelegator , Object , XmlObjectSerializerWriteContext , CollectionDataContract )
       à System.Runtime.Serialization.CollectionDataContract.WriteXmlValue(XmlWriterDelegator xmlWriter, Object obj, XmlObjectSerializerWriteContext context)
       à System.Runtime.Serialization.XmlObjectSerializerWriteContext.WriteDataContractValue(DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, RuntimeTypeHandle declaredTypeHandle)
       à System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeAndVerifyType(DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, Boolean verifyKnownType, RuntimeTypeHandle declaredTypeHandle, Type declaredType)
       à System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeWithXsiTypeAtTopLevel(DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, RuntimeTypeHandle originalDeclaredTypeHandle, Type graphType)
       à System.Runtime.Serialization.DataContractSerializer.InternalWriteObjectContent(XmlWriterDelegator writer, Object graph, DataContractResolver dataContractResolver)
       à System.Runtime.Serialization.DataContractSerializer.InternalWriteObject(XmlWriterDelegator writer, Object graph, DataContractResolver dataContractResolver)
       à System.Runtime.Serialization.XmlObjectSerializer.WriteObjectHandleExceptions(XmlWriterDelegator writer, Object graph, DataContractResolver dataContractResolver)
       à System.Runtime.Serialization.DataContractSerializer.WriteObject(XmlWriter writer, Object graph)
       à System.Net.Http.Formatting.XmlMediaTypeFormatter.<>c__DisplayClass7.<WriteToStreamAsync>b__6()
       à System.Threading.Tasks.TaskHelpers.RunSynchronously(Action action, CancellationToken token)</StackTrace></InnerException></Error>
    Voici le controller en question :

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        public class APIappelOffreController : ApiController
        {
            private GAOContainer db = new GAOContainer();
     
     
            // GET api/APIappelOffre
            public IEnumerable<appelOffre> GetappelOffres()
            {
                    var appeloffre = db.appelOffre.Include(a => a.entreprise).Include(a => a.statutAppelOffre).Include(a => a.source);
                    return appeloffre.AsEnumerable();
            }

    J'ai essayé déjà de supprimer la création de proxy mais c'est utile visiblement pour la sérialisation, et de supprimer le lazyloading sans résultat.

    Je vous remercie de votre aide.
    Cordialement.

  2. #2
    Membre du Club Avatar de Nadinette
    Femme Profil pro Nadine M
    Développeur Web
    Inscrit en
    octobre 2012
    Messages
    97
    Détails du profil
    Informations personnelles :
    Nom : Femme Nadine M
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : octobre 2012
    Messages : 97
    Points : 60
    Points
    60

    Par défaut

    Salut,

    Peux tu nous montrer la config de tes routes dans WebApiConfig.cs ?

    Merci

  3. #3
    Candidat au titre de Membre du Club
    Inscrit en
    juillet 2009
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : juillet 2009
    Messages : 58
    Points : 13
    Points
    13

    Par défaut

    Désolé pour cette réponse tardive mais voici le bout de code demandé :
    Code :
    1
    2
    3
    4
    5
    6
     
                config.Routes.MapHttpRoute(
                    name: "DefaultApi",
                    routeTemplate: "api/{controller}/{id}",
                    defaults: new { id = RouteParameter.Optional }
                );
    A savoir qu'il est d'origine.

    Ce qui m'étonne c'est que finalement ça plante alors que j'utilise uniquement du code généré.

    Merci à toi pour ton aide

  4. #4
    Membre du Club Avatar de Nadinette
    Femme Profil pro Nadine M
    Développeur Web
    Inscrit en
    octobre 2012
    Messages
    97
    Détails du profil
    Informations personnelles :
    Nom : Femme Nadine M
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : octobre 2012
    Messages : 97
    Points : 60
    Points
    60

    Par défaut Tu n'as pas l'impression qu'il manque quelque chose ?

    Code :
    1
    2
    3
    4
    5
                config.Routes.MapHttpRoute(
                    name: "DefaultApi",
                    routeTemplate: "api/{controller}/{id}",
                    defaults: new { controller = "MyController", id = RouteParameter.Optional }
                );
    Essayes avec ça en remplaçant MyController par le nom de ta classe.

    ++

  5. #5
    Candidat au titre de Membre du Club
    Inscrit en
    juillet 2009
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : juillet 2009
    Messages : 58
    Points : 13
    Points
    13

    Par défaut

    Bonjour nadinette.

    J'ai une autre erreur avec cette route :

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <Error><Message>Une erreur s’est produite.</Message><ExceptionMessage>Échec de la sérialisation du corps de la réponse par le type « ObjectContent`1 » pour le type de contenu « application/xml; charset=utf-8 ».</ExceptionMessage><ExceptionType>System.InvalidOperationException</ExceptionType><StackTrace/><InnerException><Message>Une erreur s’est produite.</Message><ExceptionMessage>Le type 'System.Data.Entity.DynamicProxies.appelOffre_6BD464C63E1E9FC18FA1B225FB275E245EE698BAB7172F027BB12C62A37D9872' avec le nom de contrat de données 'appelOffre_6BD464C63E1E9FC18FA1B225FB275E245EE698BAB7172F027BB12C62A37D9872:http://schemas.datacontract.org/2004/07/System.Data.Entity.DynamicProxies' n'est pas attendu. Utilisez un DataContractResolver ou ajoutez tous les types non connus statiquement à la liste des types connus, par exemple en utilisant l'attribut KnownTypeAttribute ou en les ajoutant à la liste des types connus qui est transmise à DataContractSerializer.</ExceptionMessage><ExceptionType>System.Runtime.Serialization.SerializationException</ExceptionType><StackTrace>   à System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeAndVerifyType(DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, Boolean verifyKnownType, RuntimeTypeHandle declaredTypeHandle, Type declaredType)
       à System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeWithXsiType(XmlWriterDelegator xmlWriter, Object obj, RuntimeTypeHandle objectTypeHandle, Type objectType, Int32 declaredTypeID, RuntimeTypeHandle declaredTypeHandle, Type declaredType)
       à System.Runtime.Serialization.XmlObjectSerializerWriteContext.InternalSerialize(XmlWriterDelegator xmlWriter, Object obj, Boolean isDeclaredType, Boolean writeXsiType, Int32 declaredTypeID, RuntimeTypeHandle declaredTypeHandle)
       à WriteArrayOfappelOffreToXml(XmlWriterDelegator , Object , XmlObjectSerializerWriteContext , CollectionDataContract )
       à System.Runtime.Serialization.CollectionDataContract.WriteXmlValue(XmlWriterDelegator xmlWriter, Object obj, XmlObjectSerializerWriteContext context)
       à System.Runtime.Serialization.XmlObjectSerializerWriteContext.WriteDataContractValue(DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, RuntimeTypeHandle declaredTypeHandle)
       à System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeAndVerifyType(DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, Boolean verifyKnownType, RuntimeTypeHandle declaredTypeHandle, Type declaredType)
       à System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeWithXsiTypeAtTopLevel(DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, RuntimeTypeHandle originalDeclaredTypeHandle, Type graphType)
       à System.Runtime.Serialization.DataContractSerializer.InternalWriteObjectContent(XmlWriterDelegator writer, Object graph, DataContractResolver dataContractResolver)
       à System.Runtime.Serialization.DataContractSerializer.InternalWriteObject(XmlWriterDelegator writer, Object graph, DataContractResolver dataContractResolver)
       à System.Runtime.Serialization.XmlObjectSerializer.WriteObjectHandleExceptions(XmlWriterDelegator writer, Object graph, DataContractResolver dataContractResolver)
       à System.Runtime.Serialization.DataContractSerializer.WriteObject(XmlWriter writer, Object graph)
       à System.Net.Http.Formatting.XmlMediaTypeFormatter.<>c__DisplayClass7.<WriteToStreamAsync>b__6()
       à System.Threading.Tasks.TaskHelpers.RunSynchronously(Action action, CancellationToken token)</StackTrace></InnerException></Error>

    Mais je ne pense pas que le problème soit la route de base.


    Merci à toi

  6. #6
    Candidat au titre de Membre du Club
    Inscrit en
    juillet 2009
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : juillet 2009
    Messages : 58
    Points : 13
    Points
    13

    Par défaut

    J'ai pu résoudre le problème mais sans vraiment comprendre pourquoi.

    Voila le contenu de la classe WebApiConfig:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
      public static class WebApiConfig
        {
            public static void Register(HttpConfiguration config)
            {
                config.Routes.MapHttpRoute(
                    name: "DefaultApi",
                    routeTemplate: "api/{controller}/{id}",
                    defaults: new { id = RouteParameter.Optional }
                );
     
                // New code:
                var json = config.Formatters.JsonFormatter;
                json.SerializerSettings.PreserveReferencesHandling =
                    Newtonsoft.Json.PreserveReferencesHandling.Objects;
     
                config.Formatters.Remove(config.Formatters.XmlFormatter);
            }
        }
    Cela change les paramètres de sérialisation pour du json plutôt que XLM ce qui correspond bien à ce que je veux faire.

    Par contre pour comprendre d’où venait le problème comment j'aurais dut faire pour que ça fonctionne avec l'XML ?

    Merci à vous

  7. #7
    Membre du Club Avatar de Nadinette
    Femme Profil pro Nadine M
    Développeur Web
    Inscrit en
    octobre 2012
    Messages
    97
    Détails du profil
    Informations personnelles :
    Nom : Femme Nadine M
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : octobre 2012
    Messages : 97
    Points : 60
    Points
    60

    Par défaut

    Salut,

    Je ne sais pas.

    Personnellement, je n'utilise les WebAPI que pour répondre à des demandes ajax simple avec peu de paramètres. En conséquence, je n'ai jamais eu ton problème.

    L'information que tu nous as donnée pourra nous être très utile.

    Merci

    Bonne journée

  8. #8
    Membre du Club
    Profil pro Arnaud
    Développeur .NET
    Inscrit en
    juillet 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Nom : Arnaud

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : juillet 2008
    Messages : 60
    Points : 57
    Points
    57

    Par défaut Vieux motard que j'aimais...

    Bonjour,

    Comme je viens d'être confronté au même souci, j'interviens pour dire que je l'ai résolu en... revoyant mon code Entity.

    En effet, je fais un peu de veille sur un projet de type EF 6.1 Code First, Web API et Backbone.js (au passage, c'est sainte trinité est assez sympa).

    Pour avoir déjà utilisé Web API, je me doutais que le souci ne provenait pas de cette brique.

    Par contre, comme je suis encore au stade débutant sur EF Code First, je suis parti sur un modèle un peu complexe pour débuter.

    Je me suis donc dit : "procède par étape". En l’occurrence, je simule un site de Vente de DVD et j'avais tout modélisé. J'ai tout simplement retirer mes entités une à une jusqu'à n'en laisser que deux : DVD et Catégorie, qui ont des relations simples.

    Depuis, aucun problème, le message d'erreur de serialisation XML a disparu. Si je réactive mes autres entités, ça plante. Donc, c'est juste que mon Code First n'est pas encore juste. Il est vrai qu'il existe quelques subtilités avec CF qu'il faut absolument apprendre car impossible à deviner/anticiper.

    Je n'appréciais que très peu la solution proposée car, quelque part, elle "castre" la Web API qui, justement, a été pensée pour pouvoir fournir une réponse à des requêtes de types JSON comme du XML.

    Voilà, voilà. En espérant que cette réponse servira à quelqu'un un jour...

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •