[WCF] Service geeft error 'Type not expected'

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • NickThissen
  • Registratie: November 2007
  • Laatst online: 27-09 13:36
Ik heb een WCF service (.NET) vanuit waar ik een lijstje met 'FavoriteThread' objecten wil terug geven. De method accepteert een email adres van de gebruiker en moet dan de favorieten van die gebruiker geven.

Ik heb dus een GetFavorites method die een List<FavoriteThread> terug geeft, heel simpel:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        public List<FavoriteThread> GetFavorites(string email)
        {
            try
            {
                email = HttpUtility.UrlDecode(email);
                using (var db = new ApplicationDbContext())
                {
                    var threads = db.FavoriteThreads.Where(f => f.UserId == email.ToLower()).ToList();
                    return threads;
                }
            }
            catch (Exception)
            {
                return null;
            }
        }


De FavoriteThread class is vrij simpel:
C#:
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
    [DataContract]
    public class FavoriteThread : BaseModel
    {
        [DataMember]
        public string UserId { get; set; }

        [JsonIgnore]
        public virtual User User { get; set; }

        [DataMember]
        public long ForumId { get; set; }
        [DataMember]
        public long ThreadId { get; set; }

        [DataMember]
        public string ForumName { get; set; }
        [DataMember]
        public string ThreadName { get; set; }

        [DataMember]
        public string Url { get; set; }
    }

    [DataContract]
    public abstract class BaseModel
    {
        protected BaseModel()
        {
            this.CreatedTime = DateTime.UtcNow;
        }

        [Key]
        [DataMember]
        public int Id { get; set; }

        public DateTime CreatedTime { get; set; }
    }


Volgens mij is dit allemaal vrij straightforward. Het wil echter maar niet werken. Ik krijg op verschillende manieren een error, de meeste zeggen niks meer dan "connection closed", maar als ik trace logging aan zet dan zie ik in de log file dat het probleem is dat de serializer het object 'FavoriteThread' niet verwacht:
There was an error while trying to serialize parameter http://tempuri.org/:GetFavoritesResult. The InnerException message was 'Type 'System.Data.Entity.DynamicProxies.FavoriteThread_F2E8E7A586A7929D030DFA02538E158928B0BB9E4BED491B9A7439D314734D02' with data contract name 'FavoriteThread_F2E8E7A586A7929D030DFA02538E158928B0BB9E4BED491B9A7439D314734D02:http://schemas.datacontract.org/2004/07/System.Data.Entity.DynamicProxies' is not expected. Consider using a DataContractResolver if you are using DataContractSerializer or add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to the serializer.'. Please see InnerException for more details.
(De InnerException zegt precies hetzelfde).


Hij vertelt me dus dat ik de KnownType attribute moet gebruiken, echter lukt dat ook niet. Misschien snap ik niet helemaal hoe dat zou moeten maar na wat googlen vind ik dat ik ofwel de KnownType attribute op de BaseModel moet zetten;
C#:
1
2
[KnownType(typeof(FavoriteThread))]
public class BaseModel { ... }


of juist andersom de KnownType met type BaseModel op de FavoriteThread class, of nog wat manieren, maar niks lijkt te werken, steeds dezelfde error.

Ik dacht dat de User property het probleem was, dus heb ik daar de DataMember weg gelaten en ook nog JsonIgnore (mocht dat zin hebben, ik wil trouwens Json terug krijgen), dat object heb ik toch niet nodig. Ook geen verschil.


Met debugging lijkt er niks mis te gaan, de method werkt prima, de threads worden opgehaald en terug gegeven, maar daarna (buiten mijn code) gaat het mis. Als ik een email opgeef wat niet bestaat dan werkt het WEL en krijg ik gewoon een lege list terug.

Wat is er aan de hand? Hoe moet ik KnownType gebruiken om dit op te lossen? Doe ik het verkeerd of zit het probleem toch ergens anders?

Mijn iRacing profiel


Acties:
  • 0 Henk 'm!

  • Feanathiel
  • Registratie: Juni 2007
  • Niet online

Feanathiel

Cup<Coffee>

Wellicht heb je hier wat aan:

https://stackoverflow.com...ramework-4-0-with-wcf-4-0

Ze geven aan dat je op je configuratie ProxyCreationEnabled op false moet zetten om niet automatisch proxies aan te laten maken.

Acties:
  • 0 Henk 'm!

  • NickThissen
  • Registratie: November 2007
  • Laatst online: 27-09 13:36
Bedankt, dat was hem! Vreemd dat ik die niet tegen gekomen ben... tig threads met hetzelfde probleem en nergens gezien dat dit het probleem was. Wel vreemd want ik heb wel eerder WCF icm EF gebruikt en dit nooit hoeven doen...

Opgelost :)

Mijn iRacing profiel