Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core
В прошлой теме в качестве клиента использовались представления самого же проекта. Однако, как правило, клиентами могут выступать самые разные типы приложений. Рассмотрим подключение к Web API из консольного приложения, написанного на C#.
Создадим проект приложения Web API с типом аутентификации Individual User Accounts (или возьмем деланный в прошлой теме). Добавим в решение второй проект - проект консольного приложения.
Добавим в проект консольного приложения через Nuget пакет Microsoft.AspNet.WebApi.Client
Изменим код консольного приложения следующим образом:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Net.Http; using Newtonsoft.Json; namespace ConsoleClient { class Program { private const string APP_PATH= "http://localhost:55122"; private static string token; static void Main(string[] args) { Console.WriteLine("Введите логин:"); string userName = Console.ReadLine(); Console.WriteLine("Введите пароль:"); string password = Console.ReadLine(); var registerResult = Register(userName, password); Console.WriteLine("Статусный код регистрации: {0}", registerResult); Dictionary<string, string> tokenDictionary = GetTokenDictionary(userName, password); token = tokenDictionary["access_token"]; Console.WriteLine(); Console.WriteLine("Access Token:"); Console.WriteLine(token); Console.WriteLine(); string userInfo = GetUserInfo(token); Console.WriteLine("Пользователь:"); Console.WriteLine(userInfo); Console.WriteLine(); string values = GetValues(token); Console.WriteLine("Values:"); Console.WriteLine(values); Console.Read(); } // регистрация static string Register(string email, string password) { var registerModel = new { Email = email, Password = password, ConfirmPassword = password }; using (var client = new HttpClient()) { var response = client.PostAsJsonAsync(APP_PATH + "/api/Account/Register", registerModel).Result; return response.StatusCode.ToString(); } } // получение токена static Dictionary<string, string> GetTokenDictionary(string userName, string password) { var pairs = new List<KeyValuePair<string, string>> { new KeyValuePair<string, string>( "grant_type", "password" ), new KeyValuePair<string, string>( "username", userName ), new KeyValuePair<string, string> ( "Password", password ) }; var content = new FormUrlEncodedContent(pairs); using (var client = new HttpClient()) { var response = client.PostAsync(APP_PATH + "/Token", content).Result; var result = response.Content.ReadAsStringAsync().Result; // Десериализация полученного JSON-объекта Dictionary<string, string> tokenDictionary = JsonConvert.DeserializeObject<Dictionary<string, string>>(result); return tokenDictionary; } } // создаем http-клиента с токеном static HttpClient CreateClient(string accessToken = "") { var client = new HttpClient(); if (!string.IsNullOrWhiteSpace(accessToken)) { client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", accessToken); } return client; } // получаем информацию о клиенте static string GetUserInfo(string token) { using (var client = CreateClient(token)) { var response = client.GetAsync(APP_PATH + "/api/Account/UserInfo").Result; return response.Content.ReadAsStringAsync().Result; } } // обращаемся по маршруту api/values static string GetValues(string token) { using (var client = CreateClient(token)) { var response = client.GetAsync(APP_PATH + "/api/values").Result; return response.Content.ReadAsStringAsync().Result; } } } }
Вначале устанавливаем две глобальные переменные для адреса сайта и токена:
private const string APP_PATH= "http://localhost:55122"; private static string token;
После ввода emailа и пароля вывызвается метод Register()
, который отправляет регистрационные данные по маршруту /api/Account/Register
Зарегистрировавшись, мы можем получить токен с помощью метода GetTokenDictionary()
. Так как возвращаемый сервером объект представляет
набор ключей и значений в формате json, то его можно преобразовать к словарь Dictionary, а из него по ключу получить сам токен:
Dictionary<string, string> tokenDictionary = GetTokenDictionary(userName, password); token = tokenDictionary["access_token"];
Получив токен, уже можно отправлять запросы к любым защищенным ресурсам. Например, далее отправляется запрос по маршруту /api/Account/UserInfo для получения данных о пользователе. И также отправляется запрос к методу Get контроллера ValuesController.
Для отправки запросов к серверу во всех методах используется класс HttpClient.
Для упрощения запросов с токеном создан вспомогательный метод CreateClient()
, который устанавливает токен в заголовках авторизации
и возвращает объект HttpClient.
static HttpClient CreateClient(string accessToken = "") { var client = new HttpClient(); if (!string.IsNullOrWhiteSpace(accessToken)) { client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", accessToken); } return client; }
Запустив параллельно оба проекта на выполнение, можно протестировать их взаимодействие: