Поделиться через


Self-Host веб-API ASP.NET 1 (C#)

Майк Уосон

В этом руководстве показано, как разместить веб-API в консольном приложении. веб-API ASP.NET не требуются службы IIS. Вы можете самостоятельно разместить веб-API в своем хост-процессе.

Новые приложения должны использовать OWIN для самостоятельного размещения веб-API. См. статью Использование OWIN для Self-Host веб-API ASP.NET 2.

Версии программного обеспечения, используемые в этом руководстве

  • Веб-API 1
  • Visual Studio 2012

Создание проекта консольного приложения

Запустите Visual Studio и выберите Создать проект на начальной странице. Или в меню Файл выберите Создать , а затем Проект.

В области Шаблоны выберите Установленные шаблоны и разверните узел Visual C# . В разделе Visual C# выберите Windows. В списке шаблонов проектов выберите Консольное приложение. Назовите проект SelfHost и нажмите кнопку ОК.

Снимок экрана: диалоговое окно

Установка целевой платформы (Visual Studio 2010)

Если вы используете Visual Studio 2010, измените целевую платформу на платформа .NET Framework 4.0. (По умолчанию шаблон проекта предназначен для клиентского профиля .NET Framework.)

В Обозреватель решений щелкните проект правой кнопкой мыши и выберите Свойства. В раскрывающемся списке Целевая платформа измените целевую платформу на платформа .NET Framework 4.0. При появлении запроса на применение изменения нажмите кнопку Да.

Снимок экрана: окно Обозреватель решений с раскрывающимся списком Целевая платформа с элементом NET Framework 4, выделенным синим цветом.

Установка диспетчера пакетов NuGet

Диспетчер пакетов NuGet — это самый простой способ добавить сборки веб-API в проект non-ASP.NET.

Чтобы проверка, установлен ли диспетчер пакетов NuGet, щелкните меню Сервис в Visual Studio. Если отображается пункт меню Диспетчер пакетов NuGet, значит, у вас есть диспетчер пакетов NuGet.

Чтобы установить диспетчер пакетов NuGet, выполните приведенные далее действия.

  1. Запустите Visual Studio.
  2. Откройте меню Средства и выберите пункт Расширения и обновления.
  3. В диалоговом окне Расширения и Обновления выберите В сети.
  4. Если вы не видите "Диспетчер пакетов NuGet", введите "диспетчер пакетов NuGet" в поле поиска.
  5. Выберите диспетчер пакетов NuGet и нажмите кнопку Скачать.
  6. После завершения скачивания появится запрос на установку.
  7. После завершения установки может появиться запрос на перезапуск Visual Studio.

Снимок экрана: диалоговое окно

Добавление пакета NuGet веб-API

После установки диспетчера пакетов NuGet добавьте пакет веб-API Self-Host в проект.

  1. В меню Сервис выберите Диспетчер пакетов NuGet. Примечание. Если этот пункт меню не отображается, убедитесь, что диспетчер пакетов NuGet установлен правильно.
  2. Выберите Управление пакетами NuGet для решения
  3. В диалоговом окне Управление пакетами NugGet выберите Интернет.
  4. В поле поиска введите Microsoft.AspNet.WebApi.SelfHost.
  5. Выберите пакет веб-API ASP.NET Self Host и нажмите кнопку Установить.
  6. После установки пакета нажмите кнопку Закрыть , чтобы закрыть диалоговое окно.

Примечание

Обязательно установите пакет с именем Microsoft.AspNet.WebApi.SelfHost, а не AspNetWebApi.SelfHost.

Снимок экрана: диалоговое окно

Создание модели и контроллера

В этом руководстве используются те же классы модели и контроллера, что и в начало работы учебнике.

Добавьте открытый класс с именем Product.

namespace SelfHost
{
    public class Product
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Category { get; set; }
        public decimal Price { get; set; }
    }
}

Добавьте открытый класс с именем ProductsController. Наследуйте этот класс от System.Web.Http.ApiController.

namespace SelfHost
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Web.Http;
    
    public class ProductsController : ApiController
    {
        Product[] products = new Product[]  
        {  
            new Product { Id = 1, Name = "Tomato Soup", Category = "Groceries", Price = 1 },  
            new Product { Id = 2, Name = "Yo-yo", Category = "Toys", Price = 3.75M },  
            new Product { Id = 3, Name = "Hammer", Category = "Hardware", Price = 16.99M }  
        };

        public IEnumerable<Product> GetAllProducts()
        {
            return products;
        }

        public Product GetProductById(int id)
        {
            var product = products.FirstOrDefault((p) => p.Id == id);
            if (product == null)
            {
                throw new HttpResponseException(HttpStatusCode.NotFound);
            }
            return product;
        }

        public IEnumerable<Product> GetProductsByCategory(string category)
        {
            return products.Where(p => string.Equals(p.Category, category,
                    StringComparison.OrdinalIgnoreCase));
        }
    }
}

Дополнительные сведения о коде в этом контроллере см. в руководстве по начало работы. Этот контроллер определяет три действия GET:

URI Описание
/api/products Получение списка всех продуктов.
/api/products/id Получение продукта по идентификатору.
/api/products/?category=category Получение списка продуктов по категориям.

Размещение веб-API

Откройте файл Program.cs и добавьте следующие операторы using:

using System.Web.Http;
using System.Web.Http.SelfHost;

Добавьте следующий код в класс Program .

var config = new HttpSelfHostConfiguration("http://localhost:8080");

config.Routes.MapHttpRoute(
    "API Default", "api/{controller}/{id}", 
    new { id = RouteParameter.Optional });

using (HttpSelfHostServer server = new HttpSelfHostServer(config))
{
    server.OpenAsync().Wait();
    Console.WriteLine("Press Enter to quit.");
    Console.ReadLine();
}

(Необязательно) Добавление резервирования пространства имен URL-адреса HTTP

Это приложение прослушивает http://localhost:8080/. По умолчанию для прослушивания определенного HTTP-адреса требуются права администратора. Таким образом, при запуске учебника может возникнуть следующая ошибка: "HTTP не удалось зарегистрировать URL-адрес http://+:8080/" Существует два способа избежать этой ошибки:

  • Запустите Visual Studio с повышенными правами администратора или
  • Используйте Netsh.exe, чтобы предоставить учетной записи разрешения на резервирование URL-адреса.

Чтобы использовать Netsh.exe, откройте командную строку с правами администратора и введите следующую команду:

netsh http add urlacl url=http://+:8080/ user=machine\username

где machine\username — ваша учетная запись пользователя.

Завершив самостоятельное размещение, обязательно удалите резервирование:

netsh http delete urlacl url=http://+:8080/

Вызов веб-API из клиентского приложения (C#)

Давайте напишем простое консольное приложение, которое вызывает веб-API.

Добавьте в решение новый проект консольного приложения:

  • В Обозреватель решений щелкните правой кнопкой мыши решение и выберите Добавить новый проект.
  • Создайте консольное приложение с именем ClientApp.

Снимок экрана: Обозреватель решений, на котором показаны пункты контекстного меню Добавить и Новый проект, выделенные белым цветом.

Используйте диспетчер пакетов NuGet, чтобы добавить пакет библиотек веб-API ASP.NET Core.

  • В меню Сервис выберите Диспетчер пакетов NuGet.
  • Выберите Управление пакетами NuGet для решения
  • В диалоговом окне Управление пакетами NuGet выберите Интернет.
  • В поле поиска введите Microsoft.AspNet.WebApi.Client.
  • Выберите пакет Клиентские библиотеки Microsoft веб-API ASP.NET и нажмите кнопку Установить.

Добавьте ссылку в ClientApp на проект SelfHost:

  • В Обозреватель решений щелкните правой кнопкой мыши проект ClientApp.
  • Выберите команду Добавить ссылку.
  • В диалоговом окне Диспетчер ссылок в разделе Решение выберите Проекты.
  • Выберите проект SelfHost.
  • Нажмите кнопку ОК.

Снимок экрана: диалоговое окно диспетчера ссылок с проектом Self Host, выделенным синей рамкой.

Откройте файл Client/Program.cs. Добавьте следующую инструкцию using :

using System.Net.Http;

Добавьте статический экземпляр HttpClient :

namespace Client
{
    class Program
    {
        static HttpClient client = new HttpClient();
    }
}

Добавьте следующие методы для перечисления всех продуктов, списка продуктов по идентификатору и списка продуктов по категориям.

static void ListAllProducts()
{
    HttpResponseMessage resp = client.GetAsync("api/products").Result;
    resp.EnsureSuccessStatusCode();

    var products = resp.Content.ReadAsAsync<IEnumerable<SelfHost.Product>>().Result;
    foreach (var p in products)
    {
        Console.WriteLine("{0} {1} {2} ({3})", p.Id, p.Name, p.Price, p.Category);
    }
}

static void ListProduct(int id)
{
    var resp = client.GetAsync(string.Format("api/products/{0}", id)).Result;
    resp.EnsureSuccessStatusCode();

    var product = resp.Content.ReadAsAsync<SelfHost.Product>().Result;
    Console.WriteLine("ID {0}: {1}", id, product.Name);
}

static void ListProducts(string category)
{
    Console.WriteLine("Products in '{0}':", category);

    string query = string.Format("api/products?category={0}", category);

    var resp = client.GetAsync(query).Result;
    resp.EnsureSuccessStatusCode();

    var products = resp.Content.ReadAsAsync<IEnumerable<SelfHost.Product>>().Result;
    foreach (var product in products)
    {
        Console.WriteLine(product.Name);
    }
}

Каждый из этих методов соответствует одному и тому же шаблону:

  1. Вызовите HttpClient.GetAsync , чтобы отправить запрос GET на соответствующий URI.
  2. Вызовите HttpResponseMessage.EnsureSuccessStatusCode. Этот метод создает исключение, если состояние HTTP-ответа является кодом ошибки.
  3. Вызовите ReadAsAsync<T> для десериализации типа CLR из HTTP-ответа. Этот метод является методом расширения, определенным в System.Net.Http.HttpContentExtensions.

Методы GetAsync и ReadAsAsync являются асинхронными. Они возвращают объекты Task , представляющие асинхронную операцию. Получение свойства Result блокирует поток до завершения операции.

Дополнительные сведения об использовании HttpClient, в том числе о том, как выполнять неблокирующие вызовы, см. в статье Вызов веб-API из клиента .NET.

Перед вызовом этих методов задайте для свойства BaseAddress экземпляра HttpClient значение "http://localhost:8080". Пример:

static void Main(string[] args)
{
    client.BaseAddress = new Uri("http://localhost:8080");

    ListAllProducts();
    ListProduct(1);
    ListProducts("toys");

    Console.WriteLine("Press Enter to quit.");
    Console.ReadLine();
}

Это должно вывести следующее. (Не забудьте сначала запустить приложение SelfHost.)

1 Tomato Soup 1.0 (Groceries)
2 Yo-yo 3.75 (Toys)
3 Hammer 16.99 (Hardware)
ID 1: Tomato Soup
Products in 'toys':
Yo-yo
Press Enter to quit.

Снимок экрана: окно консоли с выходным списком продуктов, связанных с идентификатором и категориями.