在Web API Exception中通过HttpClient登录等待client.PostAsync

时间:2016-12-09 12:37:56

标签: c# asp.net asp.net-mvc oauth httpclient

我创建了一个ASP.net项目WebAPI和一个MVC项目。 当我尝试使用带有mvc项目的HttpClient登录到web api时,它会引发异常。

MVC代码,

在AccountController中登录:

  public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
    {
        if (!ModelState.IsValid)
        {
            return View(model);
        }
        try
        {
            var client = WebApiHttpClient.GetClient();
            string username = model.Email;
            string password = model.Password;
            HttpContent content = new StringContent("grant_type=password&username=" + username + "&password=" + password,System.Text.Encoding.UTF8,
            "application/x-www-form-urlencoded");
            var response = await client.PostAsync("/Token", content);
            if (response.IsSuccessStatusCode)
            {
                //string contentResponse = await response.Content.ReadAsStringAsync();
                //return Content(contentResponse);
                TokenResponse tokenResponse =
                await response.Content.ReadAsAsync<TokenResponse>();
                WebApiHttpClient.storeToken(tokenResponse);
                // return Content(tokenResponse.AccessToken);
                return RedirectToAction("Index", "Home");

            }
            else
            {
                return Content("Error in: " + response.StatusCode);
            }
        }
        catch
        {
            return Content("Error catch .");
        }
    }

WebapiHtppClient类:用于连接API

  public class WebApiHttpClient
{
    public const string WebApiBaseAddress = "https://localhost:44379/";
    public static HttpClient GetClient()
    {
        HttpClient client = new HttpClient();
        client.BaseAddress = new Uri(WebApiBaseAddress);
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new
        MediaTypeWithQualityHeaderValue("application/json"));
        var session = HttpContext.Current.Session;
        if (session["token"] != null)
        {
            TokenResponse tokenResponse = getToken();
            client.DefaultRequestHeaders.Authorization =
            new AuthenticationHeaderValue("bearer", tokenResponse.AccessToken);
        }

        return client;
    }

    public static void storeToken(TokenResponse token)
    {
        var session = HttpContext.Current.Session;
        session["token"] = token;
    }
    public static TokenResponse getToken()
    {
        var session = HttpContext.Current.Session;
        return (TokenResponse)session["token"];
    }

}

public class TokenResponse
{
    [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; }
} 

我已经从这里尝试过很多东西,但没有找到结果。 一个是在等待client.PostAsync(“/ Token”,内容),只是把“令牌”

使用chrome的邮递员,我可以登录并查看Web Api中的内容 用这个

Postman

错误捕获:发送请求时发生错误。 mscorlib at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()at WebApplication1.Controllers.AccountController。 d _11.MoveNext()在C:\ wamp \ www \ arqsi \ it1 \ iteracao3 \ iteracao3 \ WebApplication1 \ Controllers \ AccountController.cs:第88行

1 个答案:

答案 0 :(得分:0)

我建议你放一个调试器 (在AccountController at =&gt; if(response.IsSuccessStatusCode))
此时检查
 1)如果你能够点击API,
 2)如果在您的响应变量中返回令牌