将SendAsync发送到API后MVC应用程序停止 - 相同的代码在Console App中运行良好

时间:2017-04-08 09:52:33

标签: asp.net-mvc api httpclient

我构建了一个简单的控制台应用程序来测试与API的连接。从Console App Main调用连接方法可以正常工作。我收到了一个访问令牌的响应。

我虽然我可以为MVC项目实现相同的方法/代码并在HomeController中添加方法,然后从任何ActionResult调用该方法,获取访问令牌然后将其放入ViewBag中以显示它在一个视图中(仅用于测试)。但它在MVC项目中不起作用。

如果我运行调试器,那么当在方法中执行SendAsync时,应用程序似乎会挂起。控制台提供此输出:

Application Insights遥测(未配置):{“name”:“Microsoft.ApplicationInsights.Dev.RemoteDependency”,“time”:“2017-04-08T09:26:32.4945663Z”,“tags”:{“ai。 internal.sdkVersion “:” rddf:2.2.0-738" , “ai.internal.nodeName”: “XXXXXX”, “ai.cloud.roleInstance”: “XXXXXXXX”}, “数据”:{ “基本类型”:” RemoteDependencyData “ ”baseData“:{ ”VER“:2 ”名称为“: ”/标记“, ”ID“: ”XXXXXXXXX =“, ”数据“: ”https://api.vasttrafik.se/token“, ”持续时间“:” 00 :00:00.2810000" , “发送resultCode”: “200”, “成功”:真, “类型”: “HTTP”, “目标”: “api.vasttrafik.se”, “属性”:{ “DeveloperMode”:”真正”}}}} 线程0x1f68已退出,代码为0(0x0)。

如何使API调用/响应在MVC应用程序中起作用? 我在该地区的知识非常低。但我真的想了解这里发生的事情。

谢谢! 最好 Ĵ

MVC项目

    public class HomeController : Controller
    {

        public ActionResult Index()
        {
            string token = PostRequest().Result;
            ViewBag.Token = token;

            return View();
        }

        async static Task<string> PostRequest()
        {
            var client = new HttpClient();
            client.BaseAddress = new Uri("https://api.vasttrafik.se");
            var request = new HttpRequestMessage(HttpMethod.Post, "/token");
            // Key                            // Secret
            string credentials = "xxxxxxxxxoVS5xDrcO6qZsAp0a" + ":" + "xxxxxxxxhn0STj1w4asDwixdMa";
            var plainTextBytes = Encoding.UTF8.GetBytes(credentials);
            //Key and secret encoded
            string encodedCrentedials = Convert.ToBase64String(plainTextBytes);

            //Console.WriteLine(encodedCrentedials);

            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", encodedCrentedials);

            var formData = new List<KeyValuePair<string, string>>();
            formData.Add(new KeyValuePair<string, string>("grant_type", "client_credentials"));
            formData.Add(new KeyValuePair<string, string>("scope", "xxxxxxxxw0oVS5xDrcO6qZsAp0a"));

            request.Content = new FormUrlEncodedContent(formData);
// This is where the app hangs....
            var response = await client.SendAsync(request);
            var mycontentres = await response.Content.ReadAsByteArrayAsync();
            var responseBody = Encoding.Default.GetString(mycontentres);

            //Console.WriteLine(responseBody);

            JavaScriptSerializer seri = new JavaScriptSerializer();

            dynamic data = JObject.Parse(responseBody);

            string tok = data.access_token;
            return tok;
        }
    }

1 个答案:

答案 0 :(得分:0)

Don't block on async code

public async Task<ActionResult> Index()
{
  string token = await PostRequest();
  ViewBag.Token = token;

  return View();
}