Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 7 sur 7
  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 : 12
    Points
    12

    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
    95
    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 : 95
    Points : 62
    Points
    62

    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 : 12
    Points
    12

    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
    95
    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 : 95
    Points : 62
    Points
    62

    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 : 12
    Points
    12

    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 : 12
    Points
    12

    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
    95
    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 : 95
    Points : 62
    Points
    62

    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

+ 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
  •