简体   繁体   English

读取 HttpResponseMessage.Content 在读取 webapi 2 令牌时抛出 Newtonsoft.Json.JsonReaderException

[英]Reading HttpResponseMessage.Content throws Newtonsoft.Json.JsonReaderException when reading webapi 2 token

Hi I have writen a piece of code that should login into a WebAPI 2 site from ac# desktop application everything seams to work but I get an Newtonsoft.Json.JsonReaderException with the message as follows嗨,我写了一段代码,应该从 ac# 桌面应用程序登录到 WebAPI 2 站点,一切正常,但我收到了一个 Newtonsoft.Json.JsonReaderException,消息如下

Error reading string.读取字符串时出错。 Unexpected token: StartObject.意外标记:StartObject。 Path '', line 1, position 1.路径 '',第 1 行,位置 1。

My code is as follows.我的代码如下。

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;
  }
}

The raw reponse message as reported by fiddler fiddler 报告的原始响应消息

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"}

I suspect the json parser expects a different message format then it is getting.我怀疑 json 解析器需要一种不同的消息格式,然后它会得到。 I don't want the change the webapi site so I probably have to change the client implementation.我不想更改 webapi 站点,因此我可能必须更改客户端实现。 I don't what I have to change or where i have to look.我不知道我必须改变什么或我必须看的地方。

After some intense googling I got my code working.经过一番激烈的谷歌搜索后,我的代码开始工作了。

First thing I did was added an extra class to store the token.我做的第一件事是添加了一个额外的类来存储令牌。

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; }
}

After that I changed my code to the following code.之后,我将代码更改为以下代码。

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;
    }
}

I can now get the bearer token from a WebAPI 2 site in my client so I can add it to future request.我现在可以从客户端的 WebAPI 2 站点获取不记名令牌,以便我可以将其添加到未来的请求中。 I hope it is helpful to someone else.我希望它对其他人有帮助。

另一种方法是:

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

wrong object to deserailize Example错误的对象脱轨示例

Json String JSON 字符串

{
 "status":{"code":"00","description":"Success"},
 "data":{"userId":"PPP","accessToken":"123131321"}
}

Paste Special in vs在 vs 中粘贴特殊

public class Rootobject
{
    public Status status { get; set; }
    public Data data { get; set; }
}

public class Status
{
    public string code { get; set; }
    public string description { get; set; }
}

public class Data
{
    public string userId { get; set; }
    public string accessToken { get; set; }
}

Code here:代码在这里:

    var client = new HttpClient();
    var url = url_setting;
    var data = new { username = UserName, password = PassWord };
    var result = client.PostAsync(url, data.AsJson()).Result;            
    var resp = await result.Content.ReadAsAsync<Rootobject>();            
    return resp.data.accessToken;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 Newtonsoft.Json.JsonReaderException:完成读取JSON内容后遇到的其他文本: - Newtonsoft.Json.JsonReaderException: Additional text encountered after finished reading JSON content: 从HttpResponseMessage.Content读取流式内容 - Reading streamed content from HttpResponseMessage.Content Newtonsoft.Json.JsonReaderException MobileServicesClient RegisterAsync - Newtonsoft.Json.JsonReaderException MobileServicesClient RegisterAsync 合并JSON文件(Newtonsoft.Json.JsonReaderException) - Merge JSON Files (Newtonsoft.Json.JsonReaderException) Newtonsoft.Json.JsonReaderException,无法找到程序集“ Newtonsoft.Json…” - Newtonsoft.Json.JsonReaderException, Unable to find assembly 'Newtonsoft.Json…' C# Discord Bot 错误:Newtonsoft.Json.JsonReaderException - C# Discord Bot Error: Newtonsoft.Json.JsonReaderException Newtonsoft.Json.JsonReaderException:无法将字符串转换为日期时间: - Newtonsoft.Json.JsonReaderException: Could not convert string to DateTime: HttpResponseMessage.Content为null - HttpResponseMessage.Content is null Newtonsoft.Json.JsonReaderException 无法识别左方括号“[” - Newtonsoft.Json.JsonReaderException does not recognize left square bracket “[” Newtonsoft.Json.JsonReaderException:&#39;解析值时遇到意外字符:[。 - Newtonsoft.Json.JsonReaderException: 'Unexpected character encountered while parsing value: [.
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM