C# 使用自动验证令牌的REST调用
我在XAML应用程序上编写了这个简单的调用,试图调用REST服务 该程序似乎工作,但我有异步方法的问题。。。我在fiddler上看到我收到了令牌,但程序没有注意到 我怎样才能修好它?是否有这样做的最佳实践 这是文件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.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
时会发生什么?