Заметки о выпуске ASP.NET and Web Tools для Visual Studio 2013

от Майкрософт

В этом документе описывается выпуск ASP.NET and Web Tools для Visual Studio 2013.

Содержимое

Новые возможности в ASP.NET and Web Tools для Visual Studio 2013

Замечания по установке

ASP.NET and Web Tools для Visual Studio 2013 входят в пакет установщика main. Их можно скачать здесь.

Документация

Руководства и другие сведения о ASP.NET and Web Tools для Visual Studio 2013 доступны на веб-сайте ASP.NET.

Требования к программному обеспечению

ASP.NET and Web Tools требуется Visual Studio 2013.

Новые возможности в ASP.NET and Web Tools для Visual Studio 2013

В следующих разделах описываются функции, представленные в выпуске.

Одно ASP.NET

С выпуском Visual Studio 2013 мы сделали шаг к объединению опыта использования ASP.NET технологий, чтобы вы могли легко сочетать и сопоставлять те, которые вам нужны. Например, можно запустить проект с помощью MVC и легко добавить в проект веб-формы страниц позже или сформировать шаблон веб-API в проекте веб-формы. Одна из ASP.NET заключается в том, чтобы упростить вам как разработчику делать то, что вы любите в ASP.NET. Независимо от выбранной технологии вы можете быть уверены в том, что вы используете надежную базовую платформу One ASP.NET.

Новый интерфейс веб-проекта

Мы улучшили опыт создания новых веб-проектов в Visual Studio 2013. В диалоговом окне Новый веб-проект ASP.NET можно выбрать нужный тип проекта, настроить любое сочетание технологий (веб-формы, MVC, веб-API), настроить параметры проверки подлинности и добавить проект модульного теста.

Новый проект ASP.NET

Новое диалоговое окно позволяет изменить параметры проверки подлинности по умолчанию для многих шаблонов. Например, при создании проекта ASP.NET Web Forms можно выбрать любой из следующих вариантов:

  • Без аутентификации
  • Учетные записи отдельных пользователей (ASP.NET членства или входа поставщика социальных сетей)
  • Учетные записи организации (Active Directory в интернет-приложении)
  • Проверка подлинности Windows (Active Directory в приложении интрасети)

Параметры проверки подлинности

Дополнительные сведения о новом процессе создания веб-проектов см. в статье Создание веб-проектов ASP.NET в Visual Studio 2013. Дополнительные сведения о новых параметрах проверки подлинности см. в разделе ASP.NET identity далее в этом документе.

формирование шаблонов ASP.NET

ASP.NET формирование шаблонов — это платформа создания кода для ASP.NET веб-приложений. Это упрощает добавление стандартного кода в проект, который взаимодействует с моделью данных.

В предыдущих версиях Visual Studio формирование шаблонов ограничивалось ASP.NET проектами MVC. С помощью Visual Studio 2013 теперь можно использовать формирование шаблонов для любого проекта ASP.NET, включая веб-формы. Visual Studio 2013 в настоящее время не поддерживает создание страниц для проекта веб-формы, но вы по-прежнему можете использовать формирование шаблонов с веб-формы путем добавления зависимостей MVC в проект. Поддержка создания страниц для веб-формы будет добавлена в будущем обновлении.

При использовании формирования шаблонов мы гарантируем, что все необходимые зависимости установлены в проекте. Например, если вы начинаете с проекта ASP.NET Web Forms, а затем используете формирование шаблонов для добавления контроллера веб-API, необходимые пакеты и ссылки NuGet добавляются в проект автоматически.

Чтобы добавить шаблон MVC в проект веб-формы, добавьте новый шаблонный элемент и выберите Зависимости MVC 5 в диалоговом окне. Существует два варианта формирования шаблонов MVC. Минимальный и Полный. Если выбрать минимальное значение, в проект будут добавлены только пакеты NuGet и ссылки для ASP.NET MVC. Если выбрать параметр Полный, будут добавлены минимальные зависимости, а также необходимые файлы содержимого для проекта MVC.

Поддержка формирования шаблонов асинхронных контроллеров использует новые асинхронные функции из Entity Framework 6.

Дополнительные сведения и учебники см . в статье Общие сведения о формировании шаблонов ASP.NET.

Новая функция ссылки на браузер позволяет подключить несколько браузеров к Visual Studio и обновить их все, нажав кнопку на панели инструментов. Вы можете подключить несколько браузеров к сайту разработки, включая мобильные эмуляторы, и нажать кнопку "Обновить", чтобы обновить все браузеры одновременно. Browser Link также предоставляет API, позволяющий разработчикам создавать расширения browser Link.

Снимок экрана: меню Visual Studio с выделенным значком

Предоставляя разработчикам возможность воспользоваться преимуществами API ссылки на браузер, можно создавать очень сложные сценарии, которые пересекают границы между Visual Studio и любым подключенным браузером. Web Essentials использует преимущества API для создания интегрированного взаимодействия между Visual Studio и инструментами разработчика браузера, удаленного управления мобильными эмуляторами и многого другого.

Улучшения веб-редактора Visual Studio

Visual Studio 2013 включает новый редактор HTML для файлов Razor и HTML-файлов в веб-приложениях. Новый редактор HTML предоставляет единую единую схему на основе HTML5. Он имеет автоматическое заполнение фигурных скобок, пользовательский интерфейс jQuery и атрибут AngularJS IntelliSense, группирование атрибутов IntelliSense, идентификатор и имя класса Intellisense, а также другие улучшения, включая повышение производительности, форматирование и SmartTags.

На следующем снимке экрана показано использование атрибута Bootstrap IntelliSense в редакторе HTML.

Intellisense в редакторе HTML

Visual Studio 2013 также поставляется со встроенными редакторами CoffeeScript и LESS. Редактор LESS поставляется со всеми функциями редактора CSS и имеет специальные возможности IntelliSense для переменных и миксинов во всех документах LESS в цепочке @import .

Поддержка Служба приложений Azure веб-приложения в Visual Studio

В Visual Studio 2013 с пакетом Azure SDK для .NET 2.2 можно использовать серверные Обозреватель для непосредственного взаимодействия с удаленными веб-приложениями. Вы можете войти в учетную запись Azure, создавать новые веб-приложения, настраивать приложения, просматривать журналы в режиме реального времени и многое другое. Вскоре после выпуска пакета SDK 2.2 вы сможете удаленно запускаться в режиме отладки в Azure. Большинство новых функций для Служба приложений Azure веб-приложения также работать в Visual Studio 2012 при установке текущего выпуска пакета AZURE SDK для .NET.

Дополнительные сведения см. в следующих ресурсах:

Улучшения веб-публикации

Visual Studio 2013 включает новые и улучшенные функции веб-публикации. Вот некоторые из них:

Дополнительные сведения о веб-развертывании ASP.NET см. на сайте ASP.NET.

NuGet 2.7

NuGet 2.7 включает широкий набор новых функций, подробно описанных в заметках о выпуске NuGet 2.7.

Эта версия NuGet также устраняет необходимость предоставления явного согласия для функции восстановления пакетов NuGet для скачивания пакетов. Согласие (и соответствующий флажок в диалоговом окне настроек NuGet) теперь предоставляется путем установки NuGet. Теперь восстановление пакета просто работает по умолчанию.

Веб-формы ASP.NET

Одно ASP.NET

Шаблоны проектов веб-формы легко интегрируются с новым интерфейсом One ASP.NET. Вы можете добавить поддержку MVC и веб-API в проект веб-формы, а также настроить проверку подлинности с помощью мастера создания проекта One ASP.NET. Дополнительные сведения см. в статье Создание веб-проектов ASP.NET в Visual Studio 2013.

ASP.NET Identity

Шаблоны проектов веб-формы поддерживают новую платформу удостоверений ASP.NET. Кроме того, шаблоны теперь поддерживают создание проекта веб-формы интрасети. Дополнительные сведения см. в разделе Методы проверки подлинностистатьи Создание веб-проектов ASP.NET в Visual Studio 2013.

Бутстрэп

Шаблоны веб-формы используют начальную загрузку, чтобы обеспечить гладкий и адаптивный внешний вид, который можно легко настроить. Дополнительные сведения см. в разделе Начальная загрузка в Visual Studio 2013 шаблонов веб-проектов.

ASP.NET MVC 5

Одно ASP.NET

Шаблоны веб-проектов MVC легко интегрируются с новым интерфейсом One ASP.NET. Вы можете настроить проект MVC и проверку подлинности с помощью мастера создания проектов One ASP.NET. Вводное руководство по ASP.NET MVC 5 можно найти в начало работы с ASP.NET MVC 5.

Сведения об обновлении проектов MVC 4 до MVC 5 см. в статье Обновление проекта ASP.NET MVC 4 и проекта веб-API до ASP.NET MVC 5 и веб-API 2.

ASP.NET Identity

Шаблоны проектов MVC были обновлены для использования ASP.NET Identity для проверки подлинности и управления удостоверениями. Руководство по проверке подлинности Facebook и Google и новому API членства см. в разделах Создание приложения ASP.NET MVC 5 с помощью Facebook и Google OAuth2 и Вход в OpenID и Создание приложения ASP.NET MVC с проверкой подлинности и базы данных SQL и развертывание в Служба приложений Azure.

Бутстрэп

Шаблон проекта MVC был обновлен для использования начальной загрузки , чтобы обеспечить гладкий и адаптивный внешний вид, который можно легко настроить. Дополнительные сведения см. в разделе Начальная загрузка в Visual Studio 2013 шаблонов веб-проектов.

Фильтры проверки подлинности

Фильтры проверки подлинности — это новый вид фильтров в ASP.NET MVC, которые выполняются до фильтров авторизации в конвейере ASP.NET MVC и позволяют указывать логику проверки подлинности для каждого действия, контроллера или глобально для всех контроллеров. Фильтры проверки подлинности обрабатывают учетные данные в запросе и предоставляют соответствующий субъект. Фильтры проверки подлинности также могут добавлять запросы проверки подлинности в ответ на несанкционированные запросы.

Фильтрация переопределений

Теперь можно переопределить, какие фильтры применяются к заданному методу действия или контроллеру, указав фильтр переопределения. Фильтры переопределения определяют набор типов фильтров, которые не должны выполняться для заданного область (действия или контроллера). Это позволяет настроить фильтры, которые применяются глобально, но затем исключить определенные глобальные фильтры из применения к определенным действиям или контроллерам.

Маршрутизация с помощью атрибутов

ASP.NET MVC теперь поддерживает маршрутизацию атрибутов благодаря вкладу Тима Маккола( Tim McCall), автора http://attributerouting.net. С помощью маршрутизации атрибутов можно указать маршруты, примечая действия и контроллеры.

Веб-API ASP.NET 2

Маршрутизация с помощью атрибутов

веб-API ASP.NET теперь поддерживает маршрутизацию атрибутов благодаря вкладу Тима Маккола( Tim McCall), автора .http://attributerouting.net С помощью маршрутизации атрибутов можно указать маршруты веб-API, заметив действия и контроллеры следующим образом:

[RoutePrefix("orders")] 
public class OrdersController : ApiController 
{ 
    [Route("{id}")] 
    public Order Get(int id) { } 
    [Route("{id}/approve")] 
    public Order Approve(int id) { } 
}

Маршрутизация атрибутов обеспечивает больший контроль над URI в веб-API. Например, можно легко определить иерархию ресурсов с помощью одного контроллера API:

public class MoviesController : ApiController 
{ 
    [Route("movies")] 
    public IEnumerable<Movie> Get() { } 
    [Route("actors/{actorId}/movies")] 
    public IEnumerable<Movie> GetByActor(int actorId) { } 
    [Route("directors/{directorId}/movies")] 
    public IEnumerable<Movie> GetByDirector(int directorId) { } 
}

Маршрутизация атрибутов также предоставляет удобный синтаксис для указания необязательных параметров, значений по умолчанию и ограничений маршрутов:

// Optional parameter
[Route("people/{name?}")]
// Default value
[Route("people/{name=Dan}")]
// Constraint: Alphabetic characters only. 
[Route("people/{name:alpha}")]

Дополнительные сведения о маршрутизации атрибутов см. в статье Маршрутизация атрибутов в веб-API 2.

OAuth 2.0

Шаблоны проектов веб-API и одностраничного приложения теперь поддерживают авторизацию с помощью OAuth 2.0. OAuth 2.0 — это платформа для авторизации клиентского доступа к защищенным ресурсам. Он подходит для различных клиентов, включая браузеры и мобильные устройства.

Поддержка OAuth 2.0 основана на новом ПО промежуточного слоя безопасности, предоставляемом компонентами Microsoft OWIN для проверки подлинности носителя и реализации роли сервера авторизации. Кроме того, клиенты могут быть авторизованы с помощью сервера авторизации организации, например Azure Active Directory или ADFS в Windows Server 2012 R2.

Улучшения OData

Поддержка $select, $expand, $batch и $value

веб-API ASP.NET OData теперь полностью поддерживает $select, $expand и $value. Вы также можете использовать $batch для пакетной обработки и обработки наборов изменений.

Параметры $select и $expand позволяют изменять форму данных, возвращаемых из конечной точки OData. Дополнительные сведения см. в статье Общие сведения о поддержке $select и $expand в OData веб-API.

Улучшенная расширяемость

Модули форматирования OData теперь расширяемы. Вы можете добавлять метаданные записей Atom, поддерживать именованные записи потоковых и мультимедийных ссылок, добавлять заметки экземпляров и настраивать способ создания ссылок.

Поддержка без типов

Теперь вы можете создавать службы OData без необходимости определять типы CLR для типов сущностей. Вместо этого контроллеры OData могут принимать или возвращать экземпляры IEdmObject, которые являются сериализуемыми и десериализуемыми модулями форматирования OData.

Повторное использование существующей модели

Если у вас уже есть модель данных сущности (EDM), ее можно использовать напрямую, вместо того чтобы создавать новую модель. Например, если вы используете Entity Framework, можно использовать EDM, которую ef создает.

Пакетная обработка запросов

Пакетная обработка запросов объединяет несколько операций в один HTTP-запрос POST, чтобы уменьшить сетевой трафик и обеспечить более плавный и менее многозатратный пользовательский интерфейс. веб-API ASP.NET теперь поддерживает несколько стратегий пакетной обработки запросов:

  • Используйте конечную точку $batch службы OData.
  • Упаковка нескольких запросов в один составной запрос MIME.
  • Используйте пользовательский формат пакетной обработки.

Чтобы включить пакетную обработку запросов, просто добавьте маршрут с обработчиком пакетной обработки в конфигурацию веб-API:

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
        config.Routes.MapHttpBatchRoute( 
            routeName: "WebApiBatch", 
            routeTemplate: "api/batch", 
            batchHandler: new DefaultHttpBatchHandler(GlobalConfiguration.DefaultServer)); 
    } 
}

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

Переносимый клиент веб-API ASP.NET

Теперь вы можете использовать клиент веб-API ASP.NET для создания переносимых библиотек классов, которые работают в Магазине Windows и Windows Phone 8 приложений. Вы также можете создавать переносимые модули форматирования, которые можно совместно использовать на клиенте и сервере.

Улучшенная возможность тестирования

Веб-API 2 значительно упрощает модульное тестирование контроллеров API. Просто создайте экземпляр контроллера API с сообщением запроса и конфигурацией, а затем вызовите метод действия, который вы хотите протестировать. Кроме того, можно легко имитировать класс UrlHelper для методов действий, которые выполняют создание ссылок.

IHttpActionResult

Теперь можно реализовать IHttpActionResult для инкапсуляции результатов методов действий веб-API. Функция IHttpActionResult, возвращаемая методом действия веб-API, выполняется средой выполнения веб-API ASP.NET для создания результирующих ответных сообщений. IHttpActionResult можно вернуть из любого действия веб-API, чтобы упростить модульное тестирование реализации веб-API. Для удобства предоставляется ряд реализаций IHttpActionResult, включая результаты для возврата определенных кодов состояния, форматированного содержимого или согласованных содержимым ответов.

HttpRequestContext

Новый httpRequestContext отслеживает любое состояние, которое привязано к запросу, но не сразу доступно из запроса. Например, можно использовать HttpRequestContext для получения данных маршрута, субъекта, связанного с запросом, сертификата клиента, UrlHelper и корневого каталога виртуального пути. Вы можете легко создать HttpRequestContext для модульного тестирования.

Так как субъект для запроса выполняется вместе с запросом вместо того, чтобы полагаться на Thread.CurrentPrincipal, субъект теперь доступен на протяжении всего времени существования запроса, пока он находится в конвейере веб-API.

CORS

Благодаря еще одному важному вкладу Брока Аллена, ASP.NET теперь полностью поддерживает общий доступ к запросам независимо от источника (CORS).

Параметры безопасности веб-браузера предотвращают отправку запросов AJAX с веб-страницы к другому домену. CORS — это стандарт W3C, который позволяет серверу ослабить политику того же источника. С помощью CORS сервер может явным образом разрешить некоторые запросы независимо от источника, а другие — отклонить.

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

Фильтры проверки подлинности

Фильтры проверки подлинности — это новый тип фильтров в веб-API ASP.NET, которые выполняются перед фильтрами авторизации в конвейере веб-API ASP.NET и позволяют указывать логику проверки подлинности для каждого действия, контроллера или глобально для всех контроллеров. Фильтры проверки подлинности обрабатывают учетные данные в запросе и предоставляют соответствующий субъект. Фильтры проверки подлинности также могут добавлять запросы проверки подлинности в ответ на несанкционированные запросы.

Переопределения фильтра

Теперь можно переопределить, какие фильтры применяются к заданному методу действия или контроллеру, указав фильтр переопределения. Фильтры переопределения указывают набор типов фильтров, которые не должны выполняться для заданного область (действия или контроллера). Это позволяет добавлять глобальные фильтры, а затем исключать некоторые из определенных действий или контроллеров.

Интеграция С OWIN

веб-API ASP.NET теперь полностью поддерживает OWIN и может выполняться на любом узле с поддержкой OWIN. Также включается HostAuthenticationFilter , обеспечивающий интеграцию с системой проверки подлинности OWIN.

Интеграция С OWIN позволяет самостоятельно размещать веб-API в собственном процессе наряду с другим ПО промежуточного слоя OWIN, например SignalR. Дополнительные сведения см. в статье Использование OWIN для Self-Host веб-API ASP.NET.

ASP.NET SignalR 2.0

В следующих разделах описаны функции SignalR 2.0.

Пример обновления существующего проекта версии 1.x до SignalR 2.0 см. в разделе Обновление проекта SignalR 1.x.

Создано на основе OWIN

SignalR 2.0 полностью основан на OWIN (открытый веб-интерфейс для .NET). Это изменение делает процесс настройки SignalR гораздо более согласованным между веб-приложениями и локальными приложениями SignalR, но также требует ряда изменений API.

MapHubs и MapConnection теперь являются MapSignalR

Для обеспечения совместимости со стандартами OWIN эти методы были переименованы в MapSignalR. MapSignalR При вызове без параметров будут сопоставлены все концентраторы (как MapHubs и в версии 1.x); для сопоставления отдельных объектов PersistentConnection укажите тип подключения в качестве параметра типа и расширение URL-адреса для подключения в качестве первого аргумента.

Метод MapSignalR вызывается в классе запуска Owin. Visual Studio 2013 содержит новый шаблон для класса запуска Owin. Чтобы использовать этот шаблон, сделайте следующее:

  1. Щелкните правой кнопкой мыши проект.
  2. Выберите Добавить, Создать элемент...
  3. Выберите Класс Owin Startup. Назовите новый класс Startup.cs.

В веб-приложении класс запуска Owin, содержащий MapSignalR метод , затем добавляется в процесс запуска Owin с помощью записи в узле параметров приложения файла Web.Config, как показано ниже.

В локальном приложении класс Startup передается в качестве параметра WebApp.Start типа метода .

Центры сопоставления и подключения в SignalR 1.x (из глобального файла приложения в веб-приложении):

protected void Application_Start(object sender, EventArgs e) 
{
    // Map all hubs to "/signalr"
    RouteTable.Routes.MapHubs();
    // Map the Echo PersistentConnection to "/echo"
    RouteTable.Routes.MapConnection<myconnection>("echo", "/echo");
}

Центры сопоставления и подключения в SignalR 2.0 (из файла класса Owin Startup):

using Microsoft.AspNet.SignalR;
using Microsoft.Owin;
using Owin;

[assembly: OwinStartup(typeof(MyWebApplication.Startup))]

namespace MyWebApplication
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            // Map all hubs to "/signalr"
            app.MapSignalR();
            // Map the Echo PersistentConnection to "/echo"
            app.MapSignalR<echoconnection>("/echo");
        }
    }
}

В локальном приложении класс Startup передается в качестве параметра типа для WebApp.Start метода , как показано ниже.

string url = "http://localhost:8080";
using (WebApp.Start<startup>(url))
{
    Console.WriteLine("Server running on {0}", url);
    Console.ReadLine();
}

Междоменная поддержка

В SignalR 1.x междоменные запросы управлялись одним флагом EnableCrossDomain. Этот флаг управляет запросами JSONP и CORS. Для большей гибкости вся поддержка CORS была удалена из серверного компонента SignalR (клиенты JavaScript по-прежнему используют CORS обычно, если браузер ее поддерживает), и для поддержки этих сценариев было доступно новое ПО промежуточного слоя OWIN.

В SignalR 2.0, если на клиенте требуется JSONP (для поддержки междоменных запросов в старых браузерах), его необходимо включить явно, задав для HubConfiguration объекта trueзначение EnableJSONP , как показано ниже. JSONP по умолчанию отключен, так как он менее защищен, чем CORS.

Чтобы добавить новое ПО промежуточного слоя CORS в SignalR 2.0, добавьте Microsoft.Owin.Cors библиотеку в проект и вызовите UseCors перед ПО промежуточного слоя SignalR, как показано в разделе ниже.

Добавление Microsoft.Owin.Cors в проект. Чтобы установить эту библиотеку, выполните следующую команду в консоли диспетчера пакетов:

Install-Package Microsoft.Owin.Cors

Эта команда добавит в проект версию пакета 2.0.0.

Вызов UseCors

В следующих фрагментах кода показано, как реализовать междоменные подключения в SignalR 1.x и 2.0.

Реализация междоменных запросов в SignalR 1.x (из глобального файла приложения)

protected void Application_Start(object sender, EventArgs e) 
{
    var hubConfiguration = new HubConfiguration();
    hubConfiguration.EnableCrossDomain = true;
    RouteTable.Routes.MapHubs(hubConfiguration);
}

Реализация междоменных запросов в SignalR 2.0 (из файла кода C#)

В следующем коде показано, как включить CORS или JSONP в проекте SignalR 2.0. В этом примере кода используется Map и RunSignalR вместо , поэтому ПО промежуточного MapSignalRслоя CORS выполняется только для запросов SignalR, требующих поддержки CORS (а не для всего трафика по пути, указанному в MapSignalR.), Map можно также использовать для любого другого ПО промежуточного слоя, которое должно выполняться для определенного префикса URL-адреса, а не для всего приложения.

using Microsoft.AspNet.SignalR;
using Microsoft.Owin.Cors;
using Owin;

[assembly: OwinStartup(typeof(MyWebApplication.Startup))]

namespace MyWebApplication
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            // Branch the pipeline here for requests that start with "/signalr"
            app.Map("/signalr", map =>
            {
                // Setup the CORS middleware to run before SignalR.
                // By default this will allow all origins. You can 
                // configure the set of origins and/or http verbs by
                // providing a cors options with a different policy.
                map.UseCors(CorsOptions.AllowAll);
                var hubConfiguration = new HubConfiguration 
                {
                    // You can enable JSONP by uncommenting line below.
                    // JSONP requests are insecure but some older browsers (and some
                    // versions of IE) require JSONP to work cross domain
                    // EnableJSONP = true
                };
                // Run the SignalR pipeline. We're not using MapSignalR
                // since this branch already runs under the "/signalr"
                // path.
                map.RunSignalR(hubConfiguration);
            });
        }
    }
}

Поддержка iOS и Android через MonoTouch и MonoDroid

Добавлена поддержка для клиентов iOS и Android, использующих компоненты MonoTouch и MonoDroid из библиотеки Xamarin. Дополнительные сведения об их использовании см. в статье Использование компонентов Xamarin. Эти компоненты будут доступны в хранилище Xamarin, когда станет доступен выпуск SignalR RTW.

### Переносимый клиент .NET

Чтобы упростить кроссплатформенную разработку, клиенты Silverlight, WinRT и Windows Phone были заменены одним переносимым клиентом .NET, поддерживающим следующие платформы:

  • NET 4.5
  • Silverlight 5
  • WinRT (.NET для приложений Магазина Windows)
  • Windows Phone 8

Новый пакет Self-Host

Теперь существует пакет NuGet, упрощающий работу с Self-Host SignalR (приложения SignalR, размещенные в процессе или другом приложении, а не размещенные на веб-сервере). Чтобы обновить локальный проект, созданный с помощью SignalR 1.x, удалите пакет Microsoft.AspNet.SignalR.Owin и добавьте пакет Microsoft.AspNet.SignalR.SelfHost. Дополнительные сведения о начале работы с пакетом самообслуживания см. в статье Руководство по самостоятельному размещению SignalR.

Поддержка серверов с обратной совместимостью

В предыдущих версиях SignalR версии пакета SignalR, используемого в клиенте и на сервере, должны были быть идентичными. Для поддержки приложений с толстыми клиентами, которые было бы трудно обновить, SignalR 2.0 теперь поддерживает использование более новой версии сервера с более старым клиентом. Примечание. SignalR 2.0 не поддерживает серверы, созданные в более старых версиях с новыми клиентами.

Удалена поддержка сервера для .NET 4.0

SignalR 2.0 отказалась от поддержки взаимодействия серверов с .NET 4.0. .NET 4.5 необходимо использовать с серверами SignalR 2.0. Для SignalR 2.0 по-прежнему существует клиент .NET 4.0.

Отправка сообщения списку клиентов и групп

В SignalR 2.0 можно отправить сообщение с помощью списка идентификаторов клиентов и групп. Следующие фрагменты кода демонстрируют, как это сделать.

Отправка сообщения в список клиентов и групп с помощью PersistentConnection

using Microsoft.AspNet.SignalR;
using System.Collections.Generic;
public class ChatConnection : PersistentConnection
{
    static List<string> ConnectionIds = new List<string>();
    static List<string> groups = new List<string>{"chatGroup", "chatGroup2"};
    protected override System.Threading.Tasks.Task OnReceived(IRequest request, string connectionId, string data)
    {
        Connection.Send(ConnectionIds, data);
        Groups.Send(groups, data);
        return base.OnReceived(request, connectionId, data);
    }
    protected override System.Threading.Tasks.Task OnConnected(IRequest request, string connectionId)
    {
        ConnectionIds.Add(connectionId);
        Groups.Add(connectionId, "chatGroup");
        return base.OnConnected(request, connectionId);
    }
    protected override System.Threading.Tasks.Task OnDisconnected(IRequest request, string connectionId)
    {
        ConnectionIds.Remove(connectionId);
        return base.OnDisconnected(request, connectionId);
    }
}

Отправка сообщения списку клиентов и групп с помощью Центров

using Microsoft.AspNet.SignalR;
using System.Collections.Generic;
public class ChatHub : Hub
{
    static List<string> ConnectionIds = new List<string>();
    static List<string> groups = new List<string> { "chatGroup", "chatGroup2" };
    public void Send(string name, string message)
    {
        // Call the broadcastMessage method to update clients.
        Clients.Clients(ConnectionIds).broadcastMessage(name, message);
        Clients.Groups(groups).broadcastMessage(name, message);
    }
    public override System.Threading.Tasks.Task OnConnected()
    {
        ConnectionIds.Add(Context.ConnectionId);
        Groups.Add(Context.ConnectionId, "chatGroup");
        return base.OnConnected();
    }
    public override System.Threading.Tasks.Task OnDisconnected()
    {
        ConnectionIds.Remove(Context.ConnectionId);
        return base.OnDisconnected();
    }
}

Отправка сообщения определенному пользователю

Эта функция позволяет пользователям указать, какой идентификатор пользователя основан на IRequest, с помощью нового интерфейса IUserIdProvider:

Интерфейс IUserIdProvider

public interface IUserIdProvider
{
    string GetUserId(IRequest request);
}

По умолчанию в качестве имени пользователя используется IPrincipal.Identity.Name пользователя.

В центрах вы сможете отправлять сообщения этим пользователям через новый API:

Использование API Clients.User

public class MyHub : Hub
{
    public void Send(string userId, string message)
    {
        Clients.User(userId).send(message);
    }
}

Улучшенная поддержка обработки ошибок

Теперь пользователи могут создавать исключение HubException из любого вызова концентратора. Конструктор HubException может принимать строковое сообщение и дополнительные данные об ошибке объекта. SignalR автоматически сериализует исключение и отправит его клиенту, где оно будет использоваться для отклонения или сбоя вызова метода концентратора.

Параметр показать подробные исключения концентратора не влияет на отправку HubException клиенту или нет. он всегда отправляется.

Код на стороне сервера, демонстрирующий отправку HubException клиенту

public class MyHub : Hub
{
    public void Send(string message)
    {
        if(message.Contains("<script>"))
        {
            throw new HubException("This message will flow to the client", new { user = Context.User.Identity.Name, message = message });
        }

        Clients.All.send(message);
    }
}

Клиентский код JavaScript, демонстрирующий реагирование на исключение HubException, отправленное с сервера

myHub.server.send("<script>")
            .fail(function (e) {
                if (e.source === 'HubException') {
                    console.log(e.message + ' : ' + e.data.user);
                }
            });

Код клиента .NET, демонстрирующий реагирование на исключение HubException, отправленное с сервера

try
{
    await myHub.Invoke("Send", "<script>");
}
catch(HubException ex)
{
    Conosle.WriteLine(ex.Message);
}

Упрощенное модульное тестирование концентраторов

SignalR 2.0 включает в себя интерфейс, называемый IHubCallerConnectionContext в Центрах, который упрощает создание макетов вызовов на стороне клиента. В следующих фрагментах кода показано использование этого интерфейса с популярными средствами тестирования xUnit.net и moq.

Модульное тестирование SignalR с помощью xUnit.net

[Fact]
public void HubsAreMockableViaDynamic()
{
    bool sendCalled = false;
    var hub = new MyHub();
    var mockClients = new Mock<IHubCallerConnectionContext>();
    hub.Clients = mockClients.Object;
    dynamic all = new ExpandoObject();
    all.send = new Action<string>(message =>
    {
        sendCalled = true;
    });
    mockClients.Setup(m => m.All).Returns((ExpandoObject)all);
    hub.Send("foo");
    Assert.True(sendCalled);
}

Модульное тестирование SignalR с помощью moq

[Fact]
public interface IClientContract
{
    void send(string message);
}
public void HubsAreMockableViaType()
{
    var hub = new MyHub();
    var mockClients = new Mock<IHubCallerConnectionContext>();
    var all = new Mock<IClientContract>();
    hub.Clients = mockClients.Object;
    all.Setup(m => m.send(It.IsAny<string>())).Verifiable();
    mockClients.Setup(m => m.All).Returns(all.Object);
    hub.Send("foo");
    all.VerifyAll();

Обработка ошибок JavaScript

В SignalR 2.0 все обратные вызовы обработки ошибок JavaScript возвращают объекты ошибок JavaScript вместо необработанных строк. Это позволяет SignalR передавать более подробные сведения в обработчики ошибок. Внутреннее исключение можно получить из source свойства ошибки.

Код клиента JavaScript, обрабатывающий исключение Start.Fail

connection.start().fail(function(e) {
    console.log('The error is: ' + e.message);
});

ASP.NET Identity

Новая система членства ASP.NET

ASP.NET Identity — это новая система членства для ASP.NET приложений. ASP.NET Identity упрощает интеграцию данных профиля пользователя с данными приложения. ASP.NET Identity также позволяет выбрать модель сохраняемости для профилей пользователей в приложении. Данные можно сохранять в базе данных SQL Server или другом хранилище, в том числе хранилищах данных NoSQL , таких как таблица хранилища Azure. Дополнительные сведения см. в разделе Учетные записи отдельных пользователейстатьи Создание веб-проектов ASP.NET в Visual Studio 2013.

Проверка подлинности на основе утверждений

ASP.NET теперь поддерживает проверку подлинности на основе утверждений, где удостоверение пользователя представлено в виде набора утверждений от доверенного издателя. Пользователи могут проходить проверку подлинности с помощью имени пользователя и пароля, хранящееся в базе данных приложения, или с помощью поставщиков удостоверений социальных сетей (например, учетных записей Майкрософт, Facebook, Google, Twitter) или учетных записей организации через Azure Active Directory или службы федерации Active Directory (AD FS) (ADFS).

Интеграция с Azure Active Directory и Windows Server Active Directory

Теперь можно создавать ASP.NET проекты, использующие Azure Active Directory или Windows Server Active Directory (AD) для проверки подлинности. Дополнительные сведения см. в разделе Учетные записи организациистатьи Создание веб-проектов ASP.NET в Visual Studio 2013.

Интеграция OWIN

ASP.NET проверка подлинности теперь основана на ПО промежуточного слоя OWIN, которое можно использовать на любом узле на основе OWIN. Дополнительные сведения об OWIN см. в следующем разделе Компоненты Microsoft OWIN .

Компоненты Microsoft OWIN

Открытый веб-интерфейс для .NET (OWIN) определяет абстракцию между веб-серверами .NET и веб-приложениями. OWIN отделяет веб-приложение от сервера, что делает веб-приложения не зависящими от узла. Например, можно разместить веб-приложение на основе OWIN в IIS или самостоятельно разместить его в пользовательском процессе.

Изменения, внесенные в компоненты Microsoft OWIN (также известный как проект Katana), включают новые компоненты сервера и узла, новые вспомогательные библиотеки и ПО промежуточного слоя, а также новое ПО промежуточного слоя для проверки подлинности.

Дополнительные сведения об OWIN и Katana см. в статье Новые возможности OWIN и Katana.

Примечание. Приложения OWIN не могут выполняться в классическом режиме IIS; они должны выполняться в интегрированном режиме.

Примечание. Приложения OWIN должны выполняться с полным доверием.

Новые серверы и узлы

В этом выпуске были добавлены новые компоненты для реализации сценариев локального размещения. Эти компоненты включают следующие пакеты NuGet:

  • Microsoft.Owin.Host.HttpListener. Предоставляет сервер OWIN, который использует HttpListener для прослушивания HTTP-запросов и их направления в конвейер OWIN.
  • Microsoft.Owin.Hosting Предоставляет библиотеку для разработчиков, которые хотят самостоятельно разместить конвейер OWIN в пользовательском процессе, например в консольном приложении или службе Windows.
  • OwinHost. Предоставляет автономный исполняемый Microsoft.Owin.Hosting файл, который создает оболочку и позволяет самостоятельно размещать конвейер OWIN без необходимости писать пользовательское ведущее приложение.

Кроме того, Microsoft.Owin.Host.SystemWeb пакет теперь позволяет ПО промежуточного слоя предоставлять указания для SystemWeb-сервера , указывающие, что ПО промежуточного слоя должно вызываться на определенном этапе ASP.NET конвейера. Эта функция особенно полезна для ПО промежуточного слоя для проверки подлинности, которое должно выполняться в начале конвейера ASP.NET.

Вспомогательные библиотеки и ПО промежуточного слоя

Хотя компоненты OWIN можно писать только с помощью определений функций и типов из спецификации OWIN, новый Microsoft.Owin пакет предоставляет более удобный набор абстракций. Этот пакет объединяет несколько более ранних пакетов (например, Owin.Extensions, ) Owin.Typesв единую хорошо структурированную объектную модель, которую затем можно легко использовать другими компонентами OWIN. Фактически, большинство компонентов Microsoft OWIN теперь используют этот пакет.

Примечание

Приложения OWIN не могут выполняться в классическом режиме IIS; они должны выполняться в интегрированном режиме.

Примечание

Приложения OWIN должны выполняться с полным доверием.

Этот выпуск также включает пакет Microsoft.Owin.Diagnostics, который включает ПО промежуточного слоя для проверки работающего приложения OWIN, а также ПО промежуточного слоя страницы ошибок для изучения сбоев.

Компоненты проверки подлинности

Доступны следующие компоненты проверки подлинности.

  • Microsoft.Owin.Security.ActiveDirectory. Включает проверку подлинности с помощью локальных или облачных служб каталогов.
  • Microsoft.Owin.Security.Cookies включает проверку подлинности с помощью файлов cookie. Этот пакет ранее назывался Microsoft.Owin.Security.Forms.
  • Microsoft.Owin.Security.Facebook включает проверку подлинности с помощью службы facebook на основе OAuth.
  • Microsoft.Owin.Security.Google включает проверку подлинности с помощью службы Google на основе OpenID.
  • Microsoft.Owin.Security.Jwt включает проверку подлинности с помощью маркеров JWT.
  • Microsoft.Owin.Security.MicrosoftAccount включает проверку подлинности с помощью учетных записей Майкрософт.
  • Microsoft.Owin.Security.OAuth. Предоставляет сервер авторизации OAuth, а также ПО промежуточного слоя для проверки подлинности маркеров носителя.
  • Microsoft.Owin.Security.Twitter включает проверку подлинности с помощью службы На основе OAuth в Twitter.

Этот выпуск также включает пакет Microsoft.Owin.Cors , который содержит ПО промежуточного слоя для обработки HTTP-запросов между источниками.

Примечание

Поддержка подписывания JWT была удалена в окончательной версии Visual Studio 2013.

Entity Framework 6

Список новых функций и других изменений в Entity Framework 6 см. в разделе Журнал версий Entity Framework.

ASP.NET Razor 3

ASP.NET Razor 3 включает следующие новые функции:

  • Поддержка редактирования вкладок. Ранее команда "Формат документа ", автоматическое отступ и автоматическое форматирование в Visual Studio работали неправильно при использовании параметра "Сохранить вкладки ". Это изменение исправляет форматирование Visual Studio для кода Razor для форматирования табуляции.
  • Поддержка правил переопределения URL-адресов при создании ссылок.
  • Удаление прозрачного атрибута безопасности.

    Примечание

    Это критическое изменение, и razor 3 несовместим с MVC4 и более ранними версиями, а Razor 2 несовместим с MVC5 или сборками, скомпилированными для MVC5.

=======

Приостановка приложения ASP.NET

ASP.NET Приостановка приложений — это функция, изменяющая игру в платформа .NET Framework 4.5.1, которая радикально меняет взаимодействие с пользователем и экономическую модель размещения большого количества ASP.NET сайтов на одном компьютере. Дополнительные сведения см . в разделе ASP.NET Приостановка приложения — адаптивное общее размещение веб-сайтов .NET.

Известные проблемы и критические изменения

В этом разделе описываются известные проблемы и критические изменения в ASP.NET and Web Tools для Visual Studio 2013.

NuGet

  • Восстановление нового пакета не работает в Mono при использовании SLN-файла. Оно будет исправлено в предстоящей загрузке nuget.exe и обновлении пакета NuGet.CommandLine .
  • Восстановление нового пакета не работает с проектами Wix. Оно будет исправлено в предстоящей загрузке nuget.exe и обновлении пакета NuGet.CommandLine .

ASP.NET Web API

  1. ODataQueryOptions<T>.ApplyTo(IQueryable) возвращается IQueryable<T> не всегда, так как мы добавили поддержку $select и $expand.

    В предыдущих примерах для ODataQueryOptions<T> всегда приводится возвращаемое значение из ApplyTo к IQueryable<T>. Это работало раньше, так как параметры запроса, которые мы поддерживали ранее ($filter, $orderby, $skip, ), $topне меняют форму запроса. Теперь, когда мы поддерживаем $select и $expand возвращаемое значение из ApplyTo будет не IQueryable<T> всегда.

    // Sample ODataQueryOptions<T> usage from earlier
    public IQueryable<Customer> Get(ODataQueryOptions<Customer> query)
    {
        IQueryable<customer> result="query.ApplyTo(_customers)" as iqueryable<customer>; return result;
    }
    

    Если вы используете пример кода из предыдущих версий, он продолжит работать, если клиент не отправляет $select и $expand. Однако, если вы хотите получить поддержку $select и $expand вам придется изменить этот код на этот.

    public IHttpActionResult Get(ODataQueryOptions<Customer> query)
    {
        IQueryable result = query.ApplyTo(_customers);
        return Ok(result, result.GetType());
    }
     
    private IHttpActionResult Ok(object content, Type type)
    {
        Type resultType = typeof(OkNegotiatedContentResult<>).MakeGenericType(type);
        return Activator.CreateInstance(resultType, content, this) as IHttpActionResult;
    }
    
  2. Request.Url или RequestContext.Url имеет значение NULL во время пакетного запроса.

    В сценарии пакетной обработки UrlHelper имеет значение NULL при доступе из Request.Url или RequestContext.Url.

    Обходной путь для этой проблемы — создать новый экземпляр UrlHelper, как показано в следующем примере:

    Создание нового экземпляра UrlHelper

    if (RequestContext.Url == null)
    {
        RequestContext.Url = new UrlHelper(Request);
    }
    

ASP.NET MVC 3

  1. При использовании MVC5 и OrgAuth при наличии представлений, которые выполняют проверку AntiForgerToken, при публикации данных в представление может возникнуть следующая ошибка:

    Ошибка.

    Ошибка сервера в приложении "/".

    Утверждение типа http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier или https://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider отсутствует в предоставленном ClaimsIdentity. Чтобы включить поддержку защиты от подделки маркеров с проверкой подлинности на основе утверждений, убедитесь, что настроенный поставщик утверждений предоставляет оба этих утверждения в создаваемых экземплярах ClaimsIdentity. Если настроенный поставщик утверждений использует другой тип утверждения в качестве уникального идентификатора, его можно настроить, задав статическое свойство AntiForgeryConfig.UniqueClaimTypeIdentifier.

    Обходной путь.

    Чтобы исправить это, добавьте следующую строку в Global.asax:

    AntiForgeryConfig.UniqueClaimTypeIdentifier = ClaimTypes.Name;

    Это будет исправлено в следующем выпуске.

  2. После обновления приложения MVC4 до MVC5 выполните сборку решения и запустите его. Должно появиться следующее сообщение об ошибке:

    [A] System.Web.WebPages.Razor.Configuration.HostSection нельзя привести к [B]System.Web.WebPages.Razor.Configuration.HostSection. Тип A происходит от System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 в контексте Default в расположении "C:\windows\Microsoft.Net\assembly\GAC_MSIL\System.Web.WebPages.Razor\v4.0_2.0.0.0__31bf3856ad364e35\System.Web.WebPages.Razor.dll". Тип B происходит от System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 в контексте "Default" в расположении "C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\6d05bbd0\e8b5908e\assembly\dl3\c9cbca63\f8910382_6273ce01\System.Web.WebPages.Razor.dll".

    Чтобы исправить приведенную выше ошибку, откройте все файлы Web.config (включая файлы в папке Views) в проекте и выполните следующие действия:

    1. Обновите все экземпляры system.Web.Mvc версии 4.0.0.0 до 5.0.0.0.

    2. Обновите все вхождения версии "2.0.0.0" system.Web.Helpers, System.Web.WebPages и System.Web.WebPages.Razor до "3.0.0.0".

      Например, после внесения указанных выше изменений привязки сборок должны выглядеть следующим образом:

      <dependentAssembly>
        <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="3.0.0.0" />
        </dependentAssembly>
        <dependentAssembly>
        <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="3.0.0.0" />
        </dependentAssembly>
        <dependentAssembly>
        <assemblyIdentity name="System.Web.WebPages.Razor" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
        </dependentAssembly>
        <dependentAssembly>
        <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-4.0.0.0" newVersion="5.0.0.0" />
      </dependentAssembly>
      

      Сведения об обновлении проектов MVC 4 до MVC 5 см. в статье Обновление ASP.NET MVC 4 и проекта веб-API до ASP.NET MVC 5 и веб-API 2.

  3. При использовании проверки на стороне клиента с jQuery Unobtrusive Validation сообщение проверки иногда является неправильным для входного html-элемента с type='number'. Ошибка проверки обязательного значения ("Поле "Возраст является обязательным") отображается при вводе недопустимого числа вместо правильного сообщения о том, что требуется допустимое число.

    Эта проблема обычно встречается с шаблонным кодом для модели с целочисленным свойством в представлениях Create и Edit.

    Чтобы обойти эту проблему, измените вспомогатель редактора с:

    @Html.EditorFor(person => person.Age)

    В:

    @Html.TextBoxFor(person => person.Age)

  4. ASP.NET MVC 5 больше не поддерживает частичное доверие. Проекты, связывающие двоичные файлы MVC или WebAPI, должны удалять атрибуты SecurityTransparent и AllowPartiallyTrustedCallers . Удаление этих атрибутов устранит следующие ошибки компилятора.

    Attempt by security transparent method ‘MyComponent' to access security critical type 'System.Web.Mvc.MvcHtmlString' failed. Assembly 'PagedList.Mvc, Version=4.3.0.0, Culture=neutral, PublicKeyToken=abbb863e9397c5e1' is marked with the AllowPartiallyTrustedCallersAttribute, and uses the level 2 security transparency model. Level 2 transparency causes all methods in AllowPartiallyTrustedCallers assemblies to become security transparent by default, which may be the cause of this exception.

    Обратите внимание, что в качестве побочных эффектов нельзя использовать сборки 4.0 и 5.0 в одном приложении. Необходимо обновить их все до версии 5.0.

Шаблон SPA с авторизацией Facebook может вызвать нестабильность в IE, когда веб-сайт размещен в зоне интрасети

Шаблон SPA обеспечивает внешний вход с помощью Facebook. Когда проект, созданный с помощью шаблона, выполняется локально, вход в систему может привести к сбою IE.

Решение.

  1. Размещение веб-сайта в зоне Интернета; Или

  2. Протестируйте сценарий в браузере, отличном от IE.

Формирование шаблонов веб-форм

веб-формы формирование шаблонов было удалено из VS2013 и будет доступно в будущем обновлении Visual Studio. Однако вы по-прежнему можете использовать формирование шаблонов в проекте веб-формы путем добавления зависимостей MVC и создания шаблонов для MVC. Проект будет содержать сочетание веб-формы и MVC.

Чтобы добавить MVC в проект веб-формы, добавьте новый элемент с шаблоном и выберите Зависимости MVC 5. Выберите Минимальный или Полный в зависимости от того, нужны ли все файлы содержимого, например скрипты. Затем добавьте шаблонный элемент для MVC, который создаст представления и контроллер в проекте.

Формирование шаблонов MVC и веб-API — ошибка HTTP 404, не найдено

Если при добавлении элемента с шаблонами в проект возникает ошибка, возможно, проект останется в несогласованном состоянии. Некоторые изменения, внесенные в формирование шаблонов, будут откатлены, но другие изменения, такие как установленные пакеты NuGet, не будут откаты. При откате конфигурации маршрутизации пользователи получат ошибку HTTP 404 при переходе к шаблонным элементам.

Инструкции по решению:

  • Чтобы исправить эту ошибку для MVC, добавьте новый элемент с шаблонами и выберите Зависимости MVC 5 (минимальная или полная). Этот процесс добавит все необходимые изменения в проект.

  • Чтобы устранить эту ошибку для веб-API, выполните следующие действия.

    1. Добавьте класс WebApiConfig в проект.

      public static class WebApiConfig
      {
          public static void Register(HttpConfiguration config)
          {
              config.MapHttpAttributeRoutes();
              config.Routes.MapHttpRoute(
                  name: "DefaultApi",
                  routeTemplate: "api/{controller}/{id}",
                  defaults: new { id = RouteParameter.Optional }
              );
          }
      }
      
      Public Module WebApiConfig
          Public Sub Register(ByVal config As HttpConfiguration)
              config.MapHttpAttributeRoutes()
              config.Routes.MapHttpRoute(
                name:="DefaultApi",
                routeTemplate:="api/{controller}/{id}",
                defaults:=New With {.id = RouteParameter.Optional}
              )
          End Sub
      End Module
      
    2. Настройте WebApiConfig.Register в методе Application_Start в Global.asax следующим образом:

      public class WebApiApplication : System.Web.HttpApplication
      {
          protected void Application_Start()
          {
              GlobalConfiguration.Configure(WebApiConfig.Register);    
          }
      }
      
      Public Class WebApiApplication
           Inherits System.Web.HttpApplication
       
           Sub Application_Start()     
             GlobalConfiguration.Configure(AddressOf WebApiConfig.Register)       
           End Sub
      End Class