我创建了一个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中的内容 用这个
错误捕获:发送请求时发生错误。 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行
答案 0 :(得分:0)
我建议你放一个调试器
(在AccountController at =&gt; if(response.IsSuccessStatusCode))
此时检查
1)如果你能够点击API,
2)如果在您的响应变量中返回令牌