【发布时间】:2021-09-25 09:05:12
【问题描述】:
我成功地从我的GetAccessToken() 和GetAccessTokenAsync 方法中获取了一个令牌,但是直到GetCourses 的主要方法之后才检索到令牌,这将不起作用,因为这是收集的方法我需要在我的 cshtml 页面上显示的数据。我试过拆开这个控制器并创建一个只包含 URI、apiKey 和令牌的 Globals 类,但后来我读到这对MVC 来说是不好的做法,所以我放弃了这项工作。无论如何,它在GetCourses 方法之后被调用,所以它也是死路一条。
我是 MVC 的新手,来自 WebForms 背景,我习惯于在我的 PageInit 中抛出这种代码,但我正在努力弄清楚如何在 @987654328 中实现这一点@。有人可以帮我弄清楚我做错了什么,或者我是否需要以不同的方式解决这个问题?
public ActionResult GetCourses()
{
TempData["EthosURI"] = "redacted";
TempData["Token"] = GetAccessToken().ToString();
IEnumerable<Course> courses = null;
using (var client = new HttpClient())
{
client.BaseAddress = new Uri((string)TempData["EthosURI"]);
client.DefaultRequestHeaders.Add("Authorization", "Bearer {" + (string)TempData["Token"] + "}");
client.DefaultRequestHeaders.Add("Accept", "application/json");
//HTTP GET
var responseTask = client.GetAsync("courses");
responseTask.Wait();
var result = responseTask.Result;
if (result.IsSuccessStatusCode)
{
var readTask = result.Content.ReadAsAsync<IList<Course>>();
readTask.Wait();
courses = readTask.Result;
}
else //web api sent error response
{
//log response status here..
courses = Enumerable.Empty<Course>();
ModelState.AddModelError(string.Empty, "Server error. Please contact administrator.");
}
}
return View(courses);
}
public static async Task<string> GetAccessToken()
{
var token = await GetAccessTokenAsync("redactedUrl", "redactedAPIKey");
return token;
}
public static async Task<string> GetAccessTokenAsync(string ethosURI, string apiKey)
{
using (var client = new HttpClient())
{
client.BaseAddress = new Uri(ethosURI);
client.DefaultRequestHeaders.Accept.Clear();
HttpRequestMessage request = new HttpRequestMessage
{
Method = HttpMethod.Post,
RequestUri = new Uri(ethosURI)
};
request.Headers.Clear();
request.Headers.Add("Authorization", $"Bearer {apiKey}");
request.Headers.Add("Accept", "application/json");
request.Headers.CacheControl = new CacheControlHeaderValue() { NoCache = true };
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
return await response.Content.ReadAsStringAsync();
}
}
【问题讨论】:
-
即使您没有使用 Async 对
GetAccessToken进行后缀,它仍然是一种异步方法,因此您需要等待它完成。我还建议将您的签名更改为public async Task<ActionResult> GetCourses(),这样您就可以await所有以Task或Task<TResult>作为返回类型的调用。 -
谢谢。我更改了
GetCourses()方法并且能够取回令牌。 :)
标签: c# asp.net asynchronous model-view-controller bearer-token