Précédent   Forum du club des développeurs et IT Pro > Dotnet > Développement Web avec .NET > ASP.NET MVC
ASP.NET MVC Forum d'entraide sur le développement de site web avec le framework ASP.NET MVC.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 23/12/2012, 12h50   #1
scude
Candidat au titre de Membre du Club
 
Inscription : 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.
scude est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/12/2012, 16h39   #2
Nadinette
Membre du Club
 
Avatar de Nadinette
 
Femme Nadine M
Développeur Web
Inscription : octobre 2012
Messages : 88
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 : 88
Points : 59
Points : 59
Salut,

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

Merci
Nadinette est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2013, 18h53   #3
scude
Candidat au titre de Membre du Club
 
Inscription : juillet 2009
Messages : 58
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 58
Points : 12
Points : 12
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
scude est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2013, 11h05   #4
Nadinette
Membre du Club
 
Avatar de Nadinette
 
Femme Nadine M
Développeur Web
Inscription : octobre 2012
Messages : 88
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 : 88
Points : 59
Points : 59
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.

++
Nadinette est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2013, 21h21   #5
scude
Candidat au titre de Membre du Club
 
Inscription : juillet 2009
Messages : 58
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 58
Points : 12
Points : 12
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
scude est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2013, 19h11   #6
scude
Candidat au titre de Membre du Club
 
Inscription : juillet 2009
Messages : 58
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 58
Points : 12
Points : 12
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
scude est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2013, 10h20   #7
Nadinette
Membre du Club
 
Avatar de Nadinette
 
Femme Nadine M
Développeur Web
Inscription : octobre 2012
Messages : 88
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 : 88
Points : 59
Points : 59
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
Nadinette est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 22h59.


 
 
 
 
Partenaires

Hébergement Web