2016-09-01 41 views
12

Mamy projekt interfejsu WEB API, który niedawno został przeniesiony na nowy serwer. Używam mojego projektu po dokonaniu pewnych uzupełnień do jego ładunek, ale nagle rzuca się następujący błąd:"Nie można rzucić obiektu typu" System.Net.Http.Formatting.JsonContractResolver ", aby wpisać" Newtonsoft.Json.Serialization.DefaultContractResolver "."

Unable to cast object of type 'System.Net.Http.Formatting.JsonContractResolver' to type 'Newtonsoft.Json.Serialization.DefaultContractResolver'.

Linia wykraczająca kodu w global.asax:

protected void Application_Start() { 
     GlobalConfiguration.Configure(WebApiConfig.Register); 

     var serializerSettings = 
     GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings; 
     var contractResolver = 
      (DefaultContractResolver)serializerSettings.ContractResolver; 
      contractResolver.IgnoreSerializableAttribute = true; 
    } 

wierzę ten kod został dodany, ponieważ domyślnym wyjściem API był XML, a my potrzebujemy go zamiast JSON.

Podświetlanie (DefaultContractResolver) wyświetla etykietę podpowiadającą referencje NewtonSoft.JSon.Serialization.DefaultContractResolver. Podświetlanie ustawień serializersettings.ContractResolver IContractResolver JSonSerializerSettings.ContractResolver.

Kod jest na tym komputerze od jakiegoś czasu i jedyne, co mogę zmienić, to zainstalowanie nowszej wersji .NET.

Co może spowodować, że linia kodu nagle wygeneruje błąd? I jak mogę to rozwiązać?

Dzięki!

Edit: Jak na żądanie w komentarzach, mój kod serializacji składa się z czymś tak:

json += "{\"employeename\": \"" + Convert.ToString(reader["Employee"]) 
+ "\"},"; 

return JsonConvert.DeserializeObject<OrgChartModel>(json); 

Edit2: Mamy teraz uruchomiony .NET 4.5. Zgodnie z moją wiedzą, przebiegłem 4.2 wcześniej, ale widząc, że minęło kilka miesięcy, nie mogę być tego pewien.

Zgodnie komentarzu Dominick, Próbuję zmienić obsadę do DefaultContractResolver na następujące kwestie:

  var contractResolver = 
      (IContractResolver)serializerSettings.ContractResolver; 

to jednak potem kończy się w API powrocie następujący błąd:

{"Message":"The requested resource does not support http method 'GET'."}

+0

Czy możesz dodać kod deserializacji json?Mam wątpliwość, czy użyłeś deserializacji bezpośrednio do obiektu dynamicznego, a nie używając klas. –

+0

Myślę, że błąd pojawia się w SerializerSettings, ponieważ klasa return jest 'IContractResolver JSonSerializerSettings.ContractResolver', a następnie chcesz' cast'it jako '(DefaultContractResolver)', który jest allready zawarte w 'NewtonSoft.JSon dll', że dołączasz. Musisz więc określić swój "DefaultContractResolver" jako własny, a nie biblioteki DLL. – DomeTune

+0

@PranavPatel - Gotowe. To pomaga? :) – SchmitzIT

Odpowiedz

2

udało mi się rozwiązać ten problem za pomocą nowszej wersji Json.NET (8, gdzie wcześniej używaliśmy wersji 6). Rozwiązało to błąd.

5

Z tego kodu rozumiem, że po prostu próbujesz ustawić wartość IgnoreSerializableAttribute twojego resolvera na true.

1> Czy wiesz, dlaczego tak się dzieje? Jaki jest efekt, jeśli go usuniesz? Widzę od Newton Doc, że ustawienie opcji IgnoreSerializableAttribute na wartość true spowoduje, że Newtonsoft.Json nie będzie zachowywał się jak serializatory firmy Microsoft i zamiast tego będzie serializować właściwości publiczne.

Czy nadal tego potrzebujesz?

2> Jaki jest typ twojego obecnego SerializerSettings (wiemy tylko, że nie jest to domyślny, więc prawdopodobnie gdzieś go zmienisz?) Czy na pewno nadal domyślnie jest IgnoreSerializableAttribute na false? Jeśli tak, prawdopodobnie masz sposób, aby osiągnąć ten atrybut za pomocą właściwego typu?

Nadzieja pomaga

+0

Hi. 1) Jeśli nie używam tego ustawienia, dane wyjściowe po prostu nie będą wyświetlane w formacie, który jest mi potrzebny. Nie pamiętam dokładnie co, i nie chcę zmieniać rzeczy, ponieważ teraz znowu działa. – SchmitzIT

+0

2) Nie wiem. Ja (zgodnie z moją najlepszą wiedzą) nie mam żadnego innego kodu odwołującego się do SerializerSettings w dowolnym miejscu, poza tym w global.asax. – SchmitzIT