2014-03-02 5 views
6

Hallo Ich habe geschrieben ein Stück Code, der sich in eine WebAPI 2-Site von aC# Desktop-Anwendung einloggen sollte alles funktioniert, aber ich bekomme ein Newtonsoft.Json .JsonReaderException mit folgender MeldungLesen von HttpResponseMessage.Content wirft Newtonsoft.Json.JsonReaderException beim Lesen von Webapi 2 Token

Fehler beim Lesen der Zeichenfolge. Unerwartetes Token: StartObject. Pfad '', Zeile 1, Position 1.

Mein Code ist wie folgt.

static internal async Task<string> GetBearerToken(string siteUrl, string Username, string Password) 
{ 
    HttpClient client = new HttpClient(); 
    client.BaseAddress = new Uri(siteUrl); 
    client.DefaultRequestHeaders.Accept.Clear(); 

    HttpContent content = new StringContent("grant_type=password&username=" + Username + "&password=" + Password, Encoding.UTF8, "application/x-www-form-urlencoded"); 

    Task<HttpResponseMessage> responseTask = client.PostAsync("Token", content); 
    HttpResponseMessage response = await responseTask; 

    if (response.IsSuccessStatusCode) 
    { 
    Task<string> message = response.Content.ReadAsAsync<string>(); 

    return await message; 
    } 
    else 
    { 
    return null; 
    } 
} 

Die rohe reponse Nachricht als

HTTP/1.1 200 OK 
Cache-Control: no-cache 
Pragma: no-cache 
Content-Length: 593 
Content-Type: application/json;charset=UTF-8 
Expires: -1 
Server: Microsoft-IIS/8.0 
Set-Cookie: .AspNet.Cookies=vo5b0v_43BLYlfz-rYTZ-TSGi9Rg5jSd9bvKn9693e-Kx3mMI1JVX1Sk-696f_fnPEFPRwFrNWvdMfDWUTWBElfQF3UfcUAxEE5aU5zRgI40sYKapXXnC2ucIiNKCqVsceve0cxNQYVAIr_YhMNjFLRqBX7H3BTPVKGist2AeUkWw6S4VNijx5iQhvWrAvF4xlJSznCiykNqR-QHD_ZLM5-H3GZoghrkvMpr27eXY4mLIqg4lwV2Qah0gQlXnjuWbHHZqLj5HcID1S7_OfPldBE3YqBOR2JxHLITg3yPw3lbXNkHc1UDdG9HExq0faJptz0SBqd8tIeZ7buoJTZ4LHV0TcYSEs4HZ3-Bd84XX7XeWPa5qnTaAJqXaW2FAigD38a9ASr15r5wnzWv9xQxlg; path=/; HttpOnly 
X-SourceFiles: =?UTF-8?B?RDpcMDYgUHJvamVjdEphZGVcMDIgU2FuZGJveFwwNCBDbGVhbnVwIEFQSSBBY2NvdW50XENsZWFudXBBUElBY2NvdW50XFRva2Vu?= 
X-Powered-By: ASP.NET 
Date: Sun, 02 Mar 2014 15:22:57 GMT 

{"access_token":"hM_60CprAm6DqCe7qgte1vsnih2d4j1Uy_FDlgoPkEgS_4u0__4lk5KNd0XysTktOfwMw4ffH3uaRmNaFObVnEY3yWS70hio03azUbCrFKk0VNgj31Y0_zLrd-J0ScZ4vzLdtw7KAXtNfcYySKk1EFtJRB4yYcqvobwORC3eu1VHyYInqy7kBgIhAZYE_NZ3zQrrGerZjy__zCuDdRtXO-klkFtg3dONq7cMP_TBi6xLmBjhXlhzUTKGzOrofijlkyMNHF1rx0CgWjhqEx2rJU8Hakq4Bac1pCqoLaYm91DRSrYO--ff4GWlP5wLeqZAhHIA7t17e2pyZXrUT7V1ExBeCnGkWbWoR8Y-QN8ocT7Q3xjydFd4uWSQD5B-Z1bC-nLpUrtkOGZiukl6J3aCJOqeidY6MEM4TMaJZlIp-Oc","token_type":"bearer","expires_in":1209599,"userName":"Alice",".issued":"Sun, 02 Mar 2014 15:22:57 GMT",".expires":"Sun, 16 Mar 2014 15:22:57 GMT"} 

von Fiedler berichtet Ich vermute, die json Parser erwartet ein anderes Nachrichtenformat dann wird es zu bekommen. Ich möchte nicht, dass die Webapi-Site geändert wird, daher muss ich wahrscheinlich die Client-Implementierung ändern. Ich habe nicht was ich ändern muss oder wo ich hinschauen muss.

+0

Sie sagen, Sie * JsonReaderException *, aber nichts über json in Frage stellen. Wie deserialisieren Sie die Antwort? –

+0

Ich verwende einfach die ReadAsAsync () Methode. Nirgends stelle ich einen bestimmten Parser ein. Also ich erwarte, dass C# dies unter der Haube tut. Ich kann die Ausnahme nicht mit meinem Code in Verbindung bringen. –

Antwort

8

Nach einigem intensiven googlen habe ich meinen Code funktioniert.

Das erste, was ich getan habe, wurde eine zusätzliche Klasse hinzugefügt, um das Token zu speichern.

class TokenResponseModel 
{ 
    [JsonProperty("access_token")] 
    public string AccessToken { get; set; } 

    [JsonProperty("token_type")] 
    public string TokenType { get; set; } 

    [JsonProperty("expires_in")] 
    public int ExpiresIn { get; set; } 

    [JsonProperty("userName")] 
    public string Username { get; set; } 

    [JsonProperty(".issued")] 
    public string IssuedAt { get; set; } 

    [JsonProperty(".expires")] 
    public string ExpiresAt { get; set; } 
} 

Danach habe ich meinen Code in den folgenden Code geändert.

static internal async Task<TokenResponseModel> GetBearerToken(string siteUrl, string Username, string Password) 
{ 
    HttpClient client = new HttpClient(); 
    client.BaseAddress = new Uri(siteUrl); 
    client.DefaultRequestHeaders.Accept.Clear(); 

    HttpContent requestContent = new StringContent("grant_type=password&username=" + Username + "&password=" + Password, Encoding.UTF8, "application/x-www-form-urlencoded"); 

    HttpResponseMessage responseMessage = await client.PostAsync("Token", requestContent); 

    if (responseMessage.IsSuccessStatusCode) 
    { 
     string jsonMessage; 
     using (Stream responseStream = await responseMessage.Content.ReadAsStreamAsync()) 
     { 
      jsonMessage = new StreamReader(responseStream).ReadToEnd(); 
     } 

     TokenResponseModel tokenResponse = (TokenResponseModel)JsonConvert.DeserializeObject(jsonMessage, typeof(TokenResponseModel)); 

     return tokenResponse; 
    } 
    else 
    { 
     return null; 
    } 
} 

Ich kann jetzt den Träger-Token von einem WebAPI 2 Website in meinem Klienten bekommen, damit ich es auf zukünftige Anfrage hinzufügen. Ich hoffe, es ist hilfreich für jemand anderen.

3

Ein anderer Weg, es zu tun ist:

TokenResponseModel tokenResponse = await response.Content.ReadAsAsync<TokenResponseModel>(); 
Verwandte Themen