【发布时间】:2015-08-12 16:26:17
【问题描述】:
我正在尝试在 Visual Studio 2013 上的 xamarin 共享项目中使用带有 REST api 的 Azure 媒体服务。这是我用来获取访问令牌的代码。
public HttpFactory()
{
string token = GetToken(serviceURI).Result;
//some more methods also async tasks
}
private async Task<string> GetToken(Uri serviceUri)
{
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(serviceURI);
request.Accept = "application/json";
request.Method = "GET";
request.Headers["Host"] = "media.windows.net";
request.Headers["x-ms-version"] = "2.9";
request.Headers["Authorization"] = "Bearer " + token;
var response = (HttpWebResponse) await request.GetResponseAsync();
if (response.StatusCode == HttpStatusCode.MovedPermanently)
{
serviceURI = new Uri(response.Headers["Location"]);
HttpWebRequest req = ( HttpWebRequest)WebRequest.Create(serviceURI);
var res = (HttpWebResponse)await req.GetResponseAsync();
using (Stream responseStream = res.GetResponseStream())
{
using (StreamReader reader = new StreamReader(responseStream))
{
string str = reader.ReadToEnd();
// var test = JsonConvert.DeserializeObject(str);
JToken jtoken = JsonConvert.DeserializeObject<JToken>(str);
return jtoken["access_token"].Value<string>();
}
}
}
return "";
}
但是当编译器到达-
var response = (HttpWebResponse) await request.GetResponseAsync();
它跳过了其余的代码,我从来没有得到响应。我知道代码正在运行 - 因为它在没有任务的情况下工作得很好,在 async void 方法中。
任何人都知道如何解决这个问题,还是我做错了什么?我也在 vs2015 中尝试过,但它是一样的。
【问题讨论】:
-
提示:我会考虑使用
HttpClient而不是HttpWebRequest- 这是一个更高级别的抽象,它通常避免处理流。 -
我喜欢,但是我编写的代码应该由另一个开发人员翻译成 java - 而且我不应该使用不能在 java 中使用的代码 - 或者至少很容易翻译。
标签: c# asynchronous xamarin async-await task