C# 使用自动验证令牌的REST调用

C# 使用自动验证令牌的REST调用,c#,xaml,async-await,C#,Xaml,Async Await,我在XAML应用程序上编写了这个简单的调用,试图调用REST服务 该程序似乎工作,但我有异步方法的问题。。。我在fiddler上看到我收到了令牌,但程序没有注意到 我怎样才能修好它?是否有这样做的最佳实践 这是文件xaml.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Window

我在XAML应用程序上编写了这个简单的调用,试图调用REST服务

该程序似乎工作,但我有异步方法的问题。。。我在fiddler上看到我收到了令牌,但程序没有注意到

我怎样才能修好它?是否有这样做的最佳实践

这是文件
xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Newtonsoft.Json.Linq;
using System.Net.Http;
using System.Net.Http.Headers;


namespace CallRESTToken
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void button_Click(object sender, RoutedEventArgs e)
        {
            try
            {    
                const string userName = "user";
                const string password = "password";
                const string apiBaseUri = "http://example.com";
                const string apiGetPeoplePath = "/api/values";


                //Get the token
                var token = GetAPIToken(userName, password, apiBaseUri).Result;

                textBoxtoken.Text = (token);

                //Console.WriteLine("Token: {0}", token);

                //Make the call
                var response = GetRequest(token, apiBaseUri, apiGetPeoplePath).Result;

                textBox1view.Text = (response);
                //Console.WriteLine("response: {0}", response);

                //wait for key press to exit
                //Console.ReadKey();   
            }
            catch (Exception ex)
            {

                throw ex;
            }
        }

        private static async Task<string> GetAPIToken(string userName, string password, string apiBaseUri)
        {
            try
            {    
                using (var client = new HttpClient())
                {
                    //setup client
                    client.BaseAddress = new Uri(apiBaseUri);
                    client.DefaultRequestHeaders.Accept.Clear();
                    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

                    //setup login data
                    var formContent = new FormUrlEncodedContent(new[]
                    {
                         new KeyValuePair<string, string>("grant_type", "password"),
                         new KeyValuePair<string, string>("username", userName),
                         new KeyValuePair<string, string>("password", password),
                     });

                    //send request
                    HttpResponseMessage responseMessage = await client.PostAsync("/token", formContent);

                    //get access token from response body
                    var responseJson = await responseMessage.Content.ReadAsStringAsync();
                    var jObject = JObject.Parse(responseJson);
                    return jObject.GetValue("access_token").ToString();
                }

            }
            catch (Exception ex)
            {

                throw ex;
            }

        }

        static async Task<string> GetRequest(string token, string apiBaseUri, string requestPath)
        {
            try
            {             
                using (var client = new HttpClient())
                {
                    //setup client
                    client.BaseAddress = new Uri(apiBaseUri);
                    client.DefaultRequestHeaders.Accept.Clear();
                    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                    client.DefaultRequestHeaders.Add("Authorization", "Bearer " + token);

                    //make request
                    HttpResponseMessage response = await client.GetAsync(requestPath);
                    var responseString = await response.Content.ReadAsStringAsync();
                    return responseString;
                }
            }
            catch (Exception ex)
            {

                throw ex;
            }    
        }    
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
使用System.Windows;
使用System.Windows.Controls;
使用System.Windows.Data;
使用System.Windows.Documents;
使用System.Windows.Input;
使用System.Windows.Media;
使用System.Windows.Media.Imaging;
使用System.Windows.Navigation;
使用System.Windows.Shapes;
使用Newtonsoft.Json.Linq;
使用System.Net.Http;
使用System.Net.Http.Header;
命名空间CallRESTToken
{
/// 
///MainWindow.xaml的交互逻辑
/// 
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
}
私有无效按钮\u单击(对象发送者,路由目标e)
{
尝试
{    
常量字符串userName=“user”;
const string password=“password”;
常量字符串apiBaseUri=”http://example.com";
常量字符串apiGetPeoplePath=“/api/values”;
//拿到代币
var token=GetAPIToken(用户名、密码、apiBaseUri);
Text=(令牌);
//WriteLine(“令牌:{0}”,令牌);
//打电话
var response=GetRequest(令牌、apiBaseUri、apiGetPeoplePath);
textBox1view.Text=(响应);
//WriteLine(“响应:{0}”,响应);
//等待按键退出
//Console.ReadKey();
}
捕获(例外情况除外)
{
掷骰子;
}
}
私有静态异步任务GetAPIToken(字符串用户名、字符串密码、字符串apiBaseUri)
{
尝试
{    
使用(var client=new HttpClient())
{
//安装客户端
client.BaseAddress=新Uri(apiBaseUri);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(新的MediaTypeWithQualityHeaderValue(“应用程序/json”);
//设置登录数据
var formContent=new FormUrlEncodedContent(new[]
{
新的KeyValuePair(“授权类型”、“密码”),
新的KeyValuePair(“用户名”,用户名),
新的KeyValuePair(“密码”,password),
});
//发送请求
HttpResponseMessage responseMessage=wait client.PostAsync(“/token”,formContent);
//从响应主体获取访问令牌
var responseJson=await responseMessage.Content.ReadAsStringAsync();
var jObject=jObject.Parse(responseJson);
返回jObject.GetValue(“访问令牌”).ToString();
}
}
捕获(例外情况除外)
{
掷骰子;
}
}
静态异步任务GetRequest(字符串令牌、字符串apiBaseUri、字符串请求路径)
{
尝试
{             
使用(var client=new HttpClient())
{
//安装客户端
client.BaseAddress=新Uri(apiBaseUri);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(新的MediaTypeWithQualityHeaderValue(“应用程序/json”);
client.DefaultRequestHeaders.Add(“授权”、“承载人”+令牌);
//请求
HttpResponseMessage response=wait client.GetAsync(requestPath);
var responseString=await response.Content.ReadAsStringAsync();
回报率;
}
}
捕获(例外情况除外)
{
掷骰子;
}    
}    
}
}

您将
异步
混合。结果
阻塞调用

更新事件处理程序以使用async/await并删除
.Result
阻塞调用。事件处理程序是允许
async void

private async void button_Click(object sender, RoutedEventArgs e) {
    try {

        //... code removed for brevity

        //Get the token
        var token = await GetAPIToken(userName, password, apiBaseUri);

        //... code removed for brevity

       //Make the call
        var response = await GetRequest(token, apiBaseUri, apiGetPeoplePath);

        //... code removed for brevity

    } catch (Exception ex) {
        throw ex;
    }
}
仔细阅读

你说的“程序没有注意到”是什么意思?使用调试器单步执行
GetAPIToken
时会发生什么?