Microsoft предоставили возможность облегчить труд программистов под Desktop, а именно, процесс установки и обновления вашего приложения на компьютерах пользователей через ClickOnce. Способ достаточно простой и на серверной стороне, которая предоставляет доступ к экземпляру приложения, не требуется никаких дополнительных сервисов, кроме тех которые поддерживают доступ к опубликованному контенту. Клиент сам занимается своим обновлением путем скачивания заведомо сформированных файлов приложения и манифеста. Если у пользователя установлен .NET Framework, то в его составе имеется Engine, которая будет осуществлять процесс установки. От разработчика будет требоваться только контроль за версией приложения.
Из чего состоит ClickOnce приложение?
- «Клиентское приложение» — приложение разработанное вами, и именно его планируется устанавливать вашим клиентам.
- «ClickOnce приложение» — подготовленное для развертывания «клиентское приложение» и дающее возможность себя устанавливать и обновлять.
Какие минимальные требования к клиентскому приложению?
Самая ВАЖНАЯ часть .NET
- У вашего решения, которое планируется разворачивать, должен быть хотя бы один исполняемый модуль (*.exe file). Он будет являться «Точкой входа» для вашего запускаемого приложения
- Так же сам исполняемый модуль должен быть написан для .NET, иначе у вас не получится создать ClickOnce приложение. НО! При это можно создать .NET Launcher, который после установки запускать ваше Native приложение.
Как создается ClickOnce приложение штатными средствами в Visual Studio?
- Для демонстрации Клиентское приложение, которые будем конвертировать в ClickOnce Приложение состоять из 2 файлов:
- Используя Visual Studio достаточно выбрать ваш исполняемый модуль, зайти в свойства проекта и найти закладку «Publish»
Publish folder = «E:ClieckOnceRoot» это путь локальной директории, её я добавил как виртуальный каталог на IIS в корень «Default Web Site». По умолчанию «Default Web Site» сайт слушает 80-й порт и значит папка будет доступна по адресу «http://localhost/publishroot/». Publish Version — это уже непосредственно номер версии ClickOnce приложения. Если не указывать абсолютный путь для Publish folder, тогда папка будет размещена по адресу %YOURPROJECTPATH%Путь.
Примеры и руководства .NET
Документация по .NET содержит набор примеров и руководств, которые помогают изучить .NET. Из этой статьи вы узнаете, как находить, просматривать и скачивать примеры и руководства для .NET, ASP.NET Core и C#. Ресурсы, посвященные языку программирования F#, доступны на сайте F# Foundation. Если вы хотите изучать язык C# в интерактивном редакторе кода, ознакомьтесь с этим интерактивным руководством, а затем переходите к следующему. Инструкции по просмотру и скачиванию примеров кода см. в разделе Просмотр и скачивание примеров.
How to make your first Windows app / C# lessons
.NET
Примеры
Из этого руководства вы узнаете, как создать веб-приложение ASP.NET Core и соответствующие модульные тесты. Сначала создается простое приложение веб-службы, а потом добавляются тесты. Затем создаются дополнительные тесты для внедрения новых функций. Готовый пример доступен в репозитории dotnet/samples на сайте GitHub.
Учебники
В этом учебнике показано, как создать и запустить консольное приложение .NET с помощью Visual Studio Code и .NET CLI. Задачи проекта, такие как создание, компиляция и запуск проекта, выполняются с помощью .NET CLI,
В этом руководстве показано, как создавать библиотеки для .NET с помощью Visual Studio Code и интерфейса командной строки для .NET. Задачи проекта, такие как создание, компиляция и запуск проекта, выполняются с помощью .NET CLI,
Список руководств по .NET см. в статье о средствах для .NET и пакета SDK .NET.
ASP.NET Core
См. руководства по ASP.NET Core. Многие статьи по ASP.NET Core содержат ссылки на специально созданные примеры.
C# — язык
Примеры
В этом примере демонстрируется синтаксис и функции для создания и использования итераторов C#. Готовый пример доступен в репозитории dotnet/samples на сайте GitHub.
В этом примере демонстрируется синтаксис и функции для индексаторов C#. Готовый пример доступен в репозитории dotnet/samples на сайте GitHub.
В этом примере демонстрируется синтаксис и функции для делегатов и событий C#. Готовый пример доступен в репозитории dotnet/samples на сайте GitHub. Второй пример, посвященный событиям, находится в том же репозитории.
В этом примере демонстрируется ряд проблем, которые можно устранить с помощью деревьев выражений. Готовый пример доступен в репозитории dotnet/samples на сайте GitHub.
Примеры LINQ
В этой серии примеров демонстрируются многие функции встроенного языка запросов (LINQ). Готовый пример доступен в репозитории dotnet/samples на сайте GitHub.
Пример управляемого COM-сервера
В примере COM-сервера показано создание управляемого COM-сервера, его глобальная регистрация и использование через RegFree COM.
Пример Microsoft Office PIA
В примере ExcelDemo демонстрируется использование Microsoft Office PIA в .NET Core.
Учебники
В этом руководстве демонстрируется консольный ввод-вывод, структура консольного приложения и основные сведения о модели асинхронного программирования на основе задач. Готовый пример доступен в репозитории dotnet/samples на сайте GitHub.
В этом руководстве демонстрируется веб-взаимодействие, сериализация JSON и объектно-ориентированные функции языка C#. Готовый пример доступен в репозитории dotnet/samples на сайте GitHub.
В этом учебнике демонстрируется множество функций LINQ и элементы языка, которые их поддерживают. Готовый пример доступен в репозитории dotnet/samples на сайте GitHub.
В этом руководстве показано, как создать простое консольное приложение .NET с помощью Visual Studio для Mac.
В этом руководстве показано, как создать библиотеку классов .NET с помощью Visual Studio для Mac.
В этом руководстве показано, как создать простое приложение в .NET Core, которое поддерживает архитектуру подключаемых модулей. Готовый пример доступен в репозитории dotnet/samples на сайте GitHub.
Развертывание в контейнеры
В этом руководстве показано, как развернуть существующее приложение ASP.NET MVC в контейнер Windows Docker.
Просмотр и скачивание примеров
Во многих статьях показан исходный код и примеры, которые можно просмотреть и скачать на сайте GitHub. Чтобы просмотреть пример, просто перейдите по ссылке на него. Чтобы скачать код, выполните следующие действия:
- Скачайте репозиторий, содержащий пример кода, выполнив одну из следующих процедур:
- Загрузите ZIP-файл репозитория на свой компьютер. Распакуйте архив.
- Создайте ответвление репозитория и клонируйте его на свой компьютер. Создание и клонирование ответвления позволяет участвовать в работе над документами путем сохранения изменений в ответвлении с последующим созданием запроса на включение внесенных изменений в официальный репозиторий docs. Дополнительные сведения см. в руководствах по участию в работе над документацией .NET и ASP.NET Core.
- Клонируйте репозиторий локально. Если вы клонируете репозиторий docs непосредственно на свой компьютер, вы не сможете сохранять изменения напрямую в официальном репозитории и, соответственно, не сможете участвовать в работе над документацией в дальнейшем. Чтобы сохранить возможность последующего участия в работе над документацией, используйте описанную выше процедуру ответвления и клонирования.
- Откройте в репозитории папку с примером. Относительный путь к папке с примером отображается в адресной строке браузера при переходе по ссылке на пример.
- Запустить пример можно несколькими способами:
- С использованием CLI для .NET: в окне консоли перейдите в папку с примером и используйте команды интерфейса командной строки dotnet.
- используйте Visual Studio или Visual Studio для Mac. откройте пример, выбрав файл > открыть > Project/солутион в строке меню, перейдите к папке примера проекта и выберите файл проекта (. csproj или . fsproj).
- используйте Visual Studio Code. откройте пример, выбрав файл > открыть папку в строке меню и выбрав папку проекта примера.
- Воспользуйтесь другой средой IDE, которая поддерживает проекты .NET.
Источник: learn.microsoft.com
ASP.NET Core: Создание первого веб-API с использованием ASP.NET Core MVC и Visual Studio
Протокол HTTP может использоваться не только для веб-страниц. Это еще и мощная платформа для создания API, предоставляющих сервисы и данные. Протокол HTTP прост, гибок и широко распространен. Практически любая существующая платформа имеет библиотеку HTTP, поэтому службы HTTP доступны в большом числе клиентов, включая браузеры, мобильные устройства и традиционные офисные приложения.
В новой статье из серии ASP.NET Core будет описано создание простого веб-API для работы со списком дел.
Первый цикл статей по ASP.NET Core
Введение
ASP.NET Core MVC имеет встроенную поддержку создания веб-API. Объединение двух платформ упрощает создание приложений, включающих как пользовательский интерфейс (HTML), так и API, так как в данном случае у них будет общий код и конвейер.
Примечание: если вы портируете существующее приложение веб-API на ASP.NET Core, прочитайте о том, как перейти с веб-API ASP.NET.
Описание
В этой статьей будем создавать следующий API:
API | Описание | Тело запроса | Тело ответа |
GET /api/todo | Получить все элементы списка дел | Нет | Массив элементов списка дел |
GET /api/todo/ | Получить элемент по идентификатору | Нет | Элемент списка дел |
POST /api/todo | Добавить новый элемент | Элемент списка дел | Элемент списка дел |
PUT /api/todo/ | Обновить существующий элемент | Элемент списка дел | Нет |
PATCH /api/todo/ | Обновить существующий элемент | Элемент списка дел | Нет |
DELETE /api/todo/ | Удалить элемент | Нет | Нет |
На диаграмме ниже показана архитектура приложения:
- Клиентом является ПО, которое использует веб-API (браузер, мобильное приложение и прочее). В нашей статье клиент не создается. Для тестирования приложения будет использоваться Postman.
- Модель — это объект, который представляет данные в нашем приложении. В данном случае единственная модель — это элемент списка дел. Модели представлены простыми классами C# (POCO).
- Контроллер — это объект, который обрабатывает HTTP-запрос и создает HTTP-ответ. В данном приложении один контроллер.
- Для простоты в этом материале для работы приложения не будет использоваться база данных. Вместо этого элементы списка просто хранятся в памяти. Однако уровень доступа к данным будет включен, чтобы показать раздельность веб-API и уровня данных. Вариант с использованием базы данных описан в статье.
Создание проекта
Запустите Visual Studio. В меню File выберите пункт New > Project. Выберите шаблон проекта ASP.NET Core Web Application (.NET Core). Назовите проект TodoApi , снимите отметку Host in the cloud и нажмите OK.
В окне New ASP.NET Core Web Application (.NET Core) — TodoApi выберите шаблон Web API. Нажмите OK.
Добавление класса модели
Модель — это объект, который представляет данные в нашем приложении. В данном случае единственная модель — это элемент списка дел.
Добавьте каталог с именем «Models». В обозревателе решений нажмите правую кнопку мыши на проекте. Выберите пункт Add > New Folder. Ведите имя каталога Models.
Примечание: классы модели могут находиться в любом месте проекта, но обычно их размещают в каталоге Models.
Добавьте класс TodoItem . Нажмите правую кнопку мыши на каталоге Models и выберите пункт Add > Class. Ведите имя класса TodoItem и нажмите Add.
Замените сформированный код следующим:
namespace TodoApi.Models < public class TodoItem < public string Key < get; set; >public string Name < get; set; >public bool IsComplete < get; set; >> >
Добавление класса репозитория
Репозиторий — это объект, который инкапсулирует уровень данных и содержит логику для извлечения данных и направлениях их к модели. Хотя в данном приложении не используется база данных, имеет смысл показать, как можно внедрять репозитории в контроллеры. Создайте код репозитория в каталоге Models.
Начните с определения интерфейса репозитория с названием ITodoRepository . Используйте шаблон класса (Add New Item > Class).
using System.Collections.Generic; namespace TodoApi.Models < public interface ITodoRepository < void Add(TodoItem item); IEnumerableGetAll(); TodoItem Find(string key); TodoItem Remove(string key); void Update(TodoItem item); > >
Этот интерфейс определяет основные операции CRUD.
Затем добавьте класс TodoRepository , который реализует ITodoRepository :
using System; using System.Collections.Generic; using System.Collections.Concurrent; namespace TodoApi.Models < public class TodoRepository : ITodoRepository < private static ConcurrentDictionary_todos = new ConcurrentDictionary(); public TodoRepository() < Add(new TodoItem < Name = «Item1» >); > public IEnumerable GetAll() < return _todos.Values; >public void Add(TodoItem item) < item.Key = Guid.NewGuid().ToString(); _todos[item.Key] = item; >public TodoItem Find(string key) < TodoItem item; _todos.TryGetValue(key, out item); return item; >public TodoItem Remove(string key) < TodoItem item; _todos.TryRemove(key, out item); return item; >public void Update(TodoItem item) < _todos[item.Key] = item; >> >
Постройте приложение, чтобы убедиться, что компилятор не выдает ошибок.
Регистрация репозитория
При определении интерфейса репозитория мы можем отделить класс репозитория от контроллера MVC, который его использует. Вместо реализации TodoRepository внутри контроллера мы внедрим TodoRepository , используя встроенную в ASP.NET Core поддержку внедрения зависимостей.
Такой подход упрощает модульное тестирование контроллеров. Модульные тесты внедряют «фиктивную» или «имитационную» версию ITodoRepository . В этом случае тест нацелен на логику контроллера, а не на уровень доступа к данным.
Для внедрения репозитория в контроллер необходимо зарегистрировать его при помощи контейнеров DI. Откройте файл Startup.cs. Добавьте следующую директиву using:
using TodoApi.Models;
В метод ConfigureServices добавьте выделенный код:
public void ConfigureServices(IServiceCollection services) < // Add framework services. services.AddMvc(); services.AddSingleton(); >
Добавление контроллера
В обозревателе решений нажмите правую кнопку мыши на каталоге Controllers. Выберите пункт Add > New Item. В окне Add New Item выберите шаблон Web API Controller Class. Введите имя класса TodoController .
Замените сформированный код следующим:
using System.Collections.Generic; using Microsoft.AspNetCore.Mvc; using TodoApi.Models; namespace TodoApi.Controllers < [Route(«api/[controller]»)] public class TodoController : Controller < public TodoController(ITodoRepository todoItems) < TodoItems = todoItems; >public ITodoRepository TodoItems < get; set; >> >
Таким образом определяется класс пустого контроллера. В следующих разделах описывается добавление методов для реализации API.
Получение элементов списка дел
Чтобы получить элементы списка дел, добавьте следующие методы в класс TodoController :
public IEnumerable GetAll() < return TodoItems.GetAll(); >[HttpGet(«», Name = «GetTodo»)] public IActionResult GetById(string id) < var item = TodoItems.Find(id); if (item == null) < return NotFound(); >return new ObjectResult(item); >
Эти методы реализуют два метода GET:
- GET /api/todo
- GET /api/todo/
HTTP/1.1 200 OK Content-Type: application/json; charset=utf-8 Server: Microsoft-IIS/10.0 Date: Thu, 18 Jun 2015 20:51:10 GMT Content-Length: 82 []
Далее расскажем, как можно просматривать HTTP-ответы при помощи Postman.
Маршрутизация и URL-пути
Атрибут HttpGet (HttpGetAttribute) определяет метод HTTP GET. URL-путь для каждого метода строится следующим образом:
- Возьмите строку шаблона из атрибута route контроллера: [Route(«api/[controller]»)]
- Замените [Controller] на имя контроллера, которое вы получите, взяв имя класса контроллера и убрав суффикс «Controller». В нашем примере имя класса контроллера — TodoController, а корневое имя — todo. Маршрутизация в ASP.NET Core не учитывает регистр.
- Если атрибут [HttpGet] имеет строку шаблона, добавьте ее к пути. В данном примере строка шаблона не используется.
[HttpGet(«», Name = «GetTodo»)] public IActionResult GetById(string id)
«» — это величина, заменяемая на идентификатор элемента todo . Когда GetById вызывается, значение “” в URL присваивается параметру id метода.
Name = «GetTodo» создает именованный маршрут, позволяющий ссылаться на него в HTTP-ответе. В дальнейшем это будет показано на примере.
Возвращаемые значения
Метод GetAll возвращает IEnumerable . MVC автоматически сериализует объект в JSON и записывает JSON в тело ответа. Код ответа для этого метода — 200, в том случае если нет необработанных исключений (необработанные исключения переводятся в ошибки 5xx.)
В свою очередь метод GetById возвращает значение более общего типа IActionResult , который представлен большим количеством типов возвращаемых значений. GetById имеет два различных типа возвращаемых значений:
- Если нет соответствия запрашиваемому идентификатору, метод возвращает ошибку 404. Это происходит при возврате NotFound .
- В остальных случаях метод возвращает код 200 и тело ответа в формате JSON. Это происходит при возврате ObjectResult .
Запуск приложения
Нажмите сочетание клавиш CTRL+F5 в Visual Studio, чтобы запустить приложение. Запустится браузер и откроется веб-страница http://localhost:port/api/values , где port является произвольно выбранным номером порта. Если используется Chrome, Edge или Firefox, будут отображены данные. При использовании IE будет предложено открыть или сохранить файл values.json.
Реализация других операций CRUD
Добавим методы Create , Update и Delete . Этот процесс аналогичен тому, о чем речь шла ранее, поэтому здесь будет показан код и выделены основные отличия. Создайте проект после добавления или изменения кода.
Create
[HttpPost] public IActionResult Create([FromBody] TodoItem item) < if (item == null) < return BadRequest(); >TodoItems.Add(item); return CreatedAtRoute(«GetTodo», new < >, item); >
Это метод HTTO POST, указанный в атрибуте [HttpPost]. Атрибут [FromBody] посылает команду MVC получить значение элемента списка дел из тела HTTP-запроса.
Использование Postman для отправки запроса Create
- Установите POST в качестве метода HTTP.
- Выберите переключатель Body.
- Выберите переключатель raw.
- Выберите тип JSON.
- В редакторе пар ключ-значение укажите элемент Todo следующим образом: «> .
- Нажмите Send.
Для доступа к ресурсу, который только что создан, можно использовать URL из заголовка Location. Повторно вызовите метод GetById , создавший именованный маршрут «GetTodo» :
[HttpGet(«», Name = «GetTodo»)] public IActionResult GetById(string id)
Update
[HttpPut(«»)] public IActionResult Update(string id, [FromBody] TodoItem item) < if (item == null || item.Key != id) < return BadRequest(); >var todo = TodoItems.Find(id); if (todo == null) < return NotFound(); >TodoItems.Update(item); return new NoContentResult(); >
Update подобен Create , но использует HTTP PUT. Ответ 204 (Нет содержимого).
Согласно спецификации по HTTP по запросу PUT требуется, чтобы клиент отправил обновленный объект полностью, а не только дельты. Для поддержки частичных обновлений используйте HTTP PATCH.
Update с использованием Patch
Аналогично Update , но с использованием HTTP PATCH. Ответ 204 (Нет содержимого).
[HttpPatch(«»)] public IActionResult Update([FromBody] TodoItem item, string id) < if (item == null) < return BadRequest(); >var todo = TodoItems.Find(id); if (todo == null) < return NotFound(); >item.Key = todo.Key; TodoItems.Update(item); return new NoContentResult(); >
Delete
[HttpDelete(«»)] public IActionResult Delete(string id) < var todo = TodoItems.Find(id); if (todo == null) < return NotFound(); >TodoItems.Remove(id); return new NoContentResult(); >
Источник: habr.com