2016-08-21 37 views
7

Po prostu bawię się z interfejsem internetowym Spotify i próbuję uzyskać dostęp do moich najlepiej odtwarzanych utworów. Chociaż napotkałem problem, który próbuję rozwiązać od kilku godzin, ale nie mogę znaleźć odpowiedzi.'UTF8' nie jest obsługiwaną nazwą kodowania

Kiedy próbuję deserializowania moją odpowiedź, mam follwing błąd:

'UTF8' is not a supported encoding name. For information on defining a custom encoding, see the documentation for the Encoding.RegisterProvider method. Parameter name: name The character set provided in ContentType is invalid. Cannot read content as string using an invalid character set.

ContentType jest application/json; charset=UTF8

Jakieś pomysły?

Oto mój kod żądania:

private static HttpClient GetHttpClient() 
{ 
    HttpClientHandler handler = new HttpClientHandler() { 
     AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate 
    }; 
    var httpClient = new HttpClient(handler); 
    httpClient.DefaultRequestHeaders.Add("Accept", "application/json"); 
    return httpClient; 
} 

public async Task<SearchArtistResponse> GetSelfTopAsync(string type, string userName) 
{ 
    var httpClient = GetHttpClient(); 
    httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", GetAccessToken(userName)); 

    var sb = new StringBuilder(); 
    sb.Append(ApiUrl); 
    sb.Append($"/me/top/{type}"); 
    var query = sb.ToString(); 
    var response = await httpClient.GetAsync(query); 

    var spotifyResponse = JsonConvert.DeserializeObject<SearchArtistResponse>(await response.Content.ReadAsStringAsync()); 
    return spotifyResponse; 
} 
+0

Myślę, że to tylko błąd w interfejsie Spotify Web API, wysyłający zestaw znaków charset = UTF8 zamiast charset = utf-8 dla tego punktu końcowego. Jest on złożony tutaj: https://github.com/spotify/web-api/issues/291 – jooon

+0

Rozwiązałem podobny problem przez [określenie serwera proxy] (https://stackoverflow.com/q/16526689/86967). – nobar

+0

Można po prostu przeczytać go z góry, a następnie naprawić błąd przed przekazaniem go do deserializera ... – Nyerguds

Odpowiedz

9

Używasz rdzeń .NET?

Trzeba będzie dodać poniższy kod, żeby uczynić kodowania dostępne w pulpicie .NET dostępnej w danym środowisku:

System.Text.EncodingProvider provider = System.Text.CodePagesEncodingProvider.Instance; 
Encoding.RegisterProvider(provider); 

Więcej informacji na CodePagesEncodingProvider.Instance można znaleźć here.

+0

Nie, używam .NET 4.5 @ Sephr – Fredrik

+0

Więc to nie jest przypadek ... ktoś jeszcze? – Fredrik

4

Problem powinien być walidacja nagłówku odpowiedzi Content-Type, które występują podczas rozmowy ReadAsStringAsync(), jeśli zadzwonisz ReadAsByteArrayAsync() zamiast i analizowania ciąg

(System.Text.Encoding.UTF8.GetString()) 

która zadziała !!!

+0

Tak, właśnie to działało dla mnie! –

+0

Być może najlepiej będzie sprawdzić ten ciąg "UTF8" w odebranych bajtach, aby upewnić się, że ma on _miękkę_ do UTF-8 i naprawiać go tylko wtedy, gdy trzeba to naprawić. – Nyerguds