Рубрики
Uncategorized

Создание устаревшего проекта ASP.NET (WebForms, MVC или веб-API) Больше devops дружелюбный

Поддержание устаревшего проекта ASP.NET легко Как только вы модернизируете файл проекта. Помечено с помощью WebForms, DEVOPS, CSHARP.

Введение

Найти разработчиков с большим опытом с WebForms нелегко. Большинство из нас достаточно взрослых, чтобы знать, что знания не могут разобраться с ним ежедневно или иметь прямое влияние на те, которые делают. Большинство разработчиков до сих пор работают с WebForms, предпочли бы работать над более новыми, Shinier Frameworks. Но существует огромное количество критического кода миссии, работающего в WebForms, и прямо сейчас много давления для автоматизации большего количества процессов.

WebForms исходит из эпохи, где команды DEV были ответственны за все, вплоть до проблем отладки в производстве. Тогда В мире произошло и что привилось в SARB OX , что привело к исполнению Разделение обязанностей Отказ Вместо того, чтобы разработчик свинца нажимал на основе каждой среды из Visual Studio, сетевой админ нажимал основания для каждой среды из Visual Studio, поскольку разработчик свинца, наблюдал в ужасе, когда мышь, зависевший на любой значок, отличную от того, что они проинструктировали администрацию сети Нажмите.

Все знали, что это невозможно продолжать делать, и поэтому devops получил свое начало исправить эту зияющую дыру в SDLC Отказ Одной из самых сложных частей разработки WebForms всегда тестировала. Товары, такие как Рациональный робот Были ли чрезвычайно дорогими лицензию и учиться, поэтому Microsoft охватывала тестирование подразделения и восстанавливает ASP.NET вокруг тестируемых слоев кода и представила Framework MVC, которая по-прежнему является основным способом, что Core ASP.NET и ASP.NET используется для сервера боковой рендеринг HTML.

WebForms и MVC построены на одних и тех же костях, и можно смешать две парадигмы в одном приложении. Это обеспечило путь миграции для многих проектов за последние десять лет или около того, но не все проекты даже подвели из WebForms. Поскольку последние технологии выкатились, WebForms приспособился к тому, чтобы принять их и даже преуспеть с ними. В настоящее время я помогаю поддерживать кодовую базу WebForms, которая смешивает традиционные веб-формы, Vue.js и Roam Ajax Calles. Это удивительно эффективная комбинация, но с этим возникают проблемы.

Во-первых, тестирование подразделения — это боль, и получение хорошего покрытия трудно из-за всех необычных способов, которыми могут взаимодействовать различные слои. Далее есть самая большая боль с .NET Framework’s Asp.net: Доступ к HTTPContext из ASYNC-метода может быть сложно. Я завел писать WebFormstaskscheduLer Чтобы решить проблему, но это означает, что в любом месте необходимо вызвать асинхронный метод из потока ASP.NET, должен использовать соответствующую планировщик задач. Библиотечный код не будет знать, чтобы сделать это, поэтому звонить в библиотечный код, который может Позвоните ASYNC-метод требует упаковки его в задачу, которая отправляется из Webformstaskschedular (посяженные задачи будут использовать эту задачу, если они не определяют свои собственные).

Но как только вы узнаете об этих болевых точках и выясните их решения, мотивация отказаться от WebForms уменьшается. Это означает, что вы собираетесь в конечном итоге хотите управлять этими приложениями с современными трубопроводами CI/CD и принимая их как управляемые сервисы, и не ейте стоимость VM только для одного приложения.

Большинство .NET. Магазины довольно знакомы с командой. Долгое время это был самый разумный способ использовать CI/CD с .NET Фреймворк. Команда город страдает от обычной болезни: админ-админ. Везде, где я был, настройка трубопроводов в команде города была закрытым процессом с небольшим количеством разработчиков. Итак, devs будучи devs, мы создаем такие вещи, как Торт сборки , Nuke Build. и Petter Что дает команде City Admin простой способ выполнить сборку без записи. Нет простых шаблонов YAML для настройки команды.

Используя торт или NUKE, вы пишете C # код для выполнения сложных сборки. Торт — это сценаривный язык (на основе сценария Roslyn C # от Microsoft) и Nuke является предложенным сердечником Dotnet. Оба позволяют вам обобщать сценарии к шаблонам, которые можно повторно использовать на нескольких проектах. По моему опыту, Nuke гораздо проще реализовать и отлаживать. Pester — библиотека PowerShell, чтобы сделать что угодно. Буквально. Существуют модули для создания модульных тестов, сборки сценариев и приложений WinForms с Pester, это тема, которая слишком широкая для меня, чтобы укрыться сегодня, но если вам нравится писать сценарии, чтобы сделать свою грязную работу, PowerShell + Pester изменит вашу жизнь.

Итак, каковы проблемы при доведении WebForms на другие трубопроводы CI/CD, в частности Azure DEVOPS и Действия GitHub? Первая задача составляла с монтажной резолюцией и версиями. Часто командные городские серверы имеют годы устаревшего опыта, встроенного в них. Слои зависимостей были установлены и, как известно, всегда присутствуют, и их версия всегда известна. Azure DevOps и Действия GitHub работают в контейнерах. Каждый раз используется контейнер; Это начинается с известного чистого состояния. Вы должны создать зависимости каждый раз, когда вы запускаете трубопровод. Это может быть медленным и утомительным, особенно если мигрировать из команды города. Принимая во внимание, что командные серверы команд, как правило, обслуживают несколько репозиториев и проектов одновременно, каждый трубопровод Azure DevOps обслуживает ровно один экземпляр одного репозитория. Каждый репозиторий предоставляет детали выполнения трубопроводов, поэтому множественные репо, с той же конфигурацией CI/CD будут дублировать трубопроводные ресурсы, которые где Шаблоны Войдите. Как видите, концепции создания и обслуживания трубопроводов CI/CD в Azure или Github полностью противоположны этого в команде.

Вернуться к разрешению сборки. Microsoft, очевидно, сделана с .NET Фреймворк. Так много так, чтобы .NET Framework 4.8 Справочные сборки Ships для системы. Время выполнения которые еще нет реализации, доступных на Nuget.org Отказ И в этой загадке есть другие сборки. Если вы нацеливаете .NET Framework 4.8 В ваших проектах это не имеет большого значения, потому что фактические реализации являются включены в .NET. Framework 4.8. Но если вы не можете перейти к .NET Framework 4.8, у вас сейчас есть проблема.

Эта проблема поступает из логики резолюции сборки по умолчанию в MSBUILD 16.x. В файле проекта в классическом стиле, ссылки на сборку из пакета Nuget или определенного местоположения на диске не являются абсолютно гарантированы для использования подсказки для сборки. Пусть это погрузится на мгновение. Давайте предположим, что у вас есть эта ссылка:


 C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.Runtime.dll

Можно предположить, что эта ссылка будет всегда Разрешить систему .runtime.dll из C: \ Windows \ Microsoft. Net \ framework \ v4.0.30319 \ Система. Runtime.dll Отказ К сожалению, если .NET Рамки 4.8 установлен, вместо этого он будет разрешаться C: \ Файлы программы (X86) \ Справочные сборки \ Microsoft \ framework \ .Netframework \ v4.8 \ facades \ Система. Runtime.dll Отказ Все собрания в Фасад Папка — это просто безопасные опорные оболочки типа, которые предназначены для разрешения типов компилятором. Если вы распространяете или попытаетесь создавать что-либо создать что-либо, от этих сборки, ваше приложение будет сбиваться с помощью полезного сообщения, которое объясняет, что вы используете нереализацию сборки. Затем это приведет вас к Nuget, чтобы найти правильный пакет, чтобы включить.

Скачайте и разбейте открыть новейшую версию там, и вы найдете новейшую целевую структуру, это 4.6.2, а сборка включает в себя сильное имя Система. Runtime, .1.1.1 ,, Отказ

Сильное имя на эталонной сборке — Система. Runtime, .1.2.0 ,, Отказ

Хьюстон, у нас проблема.

Но тогда вы помните, вы можете использовать перенаправление связывания во время выполнения! И если у вас есть правильно Сборка в пути разрешения тогда она будет работать. Но я пишу это по причине: резолюция сборки во время Процесс сборки Всегда выбирает ссылочную сборку .NET 4.8, игнорируя любые подсказки или перенаправление связывания.

Решение

В вашем файле проекта добавьте эту цель:


Да это оно. Как вы можете видеть из имени, эта цель похоронена глубоко в MSBuild, и ее работа — это разрешение называть столкновения на сборках. К сожалению, это сломано и всегда выбирает эталонные сборы .NET 4.8, без проваливания. Включая эту цель в вашем файле проекта, он переопределяет цель MSBuild, предотвращая его запуску и позволять любую подсказку, которое необходимо использовать для разрешения сборки из пакетов Nuget.

Другие полезные подсказки

Трубопровод CI/CD на Azure или GitHub всегда начнутся с пустых пакетов пакетов. Все ссылки должны быть загружены каждый раз. С помощью MSBuild и Nuget вам необходимо выбрать место раньше времени для скачивания пакетов.

Некоторые репозитории могут иметь входящую папку пакетов (в первые дни использования Nuget людей были параноиком несоответствия Nupkg файлы и часто включали их зависимости в TFS), и если это так, вы можете игнорировать эту часть.

Чтобы избежать пакетов папки, включенной в хранилище, я видел, что многие Орги выбирают, чтобы разместить его в родительской папке в папку «Репозиторию», что дает отношение ../packages. из рута репозитория. Это совершенно разумно и не повлияет на TeamCity или Azure DEVOPS. Размещение Nuget.config Файл в корне репозитория — лучший способ обеспечить применение этого местоположения, просто помните, как всегда Ссылка этого файла конфигурации на каждой работе Nuget.

При изучении задачи выше, одна из вещей, которые я проехал, было руководством от MSBuild Team для использования абсолютных ссылок на пути подсказки. Это означает, что ваш файл проекта должен будет рассчитать точное местоположение папки пакетов.


    $([System.IO.Path]::GetFullPath('..\..\'))
    $(MSBuildProjectDirectory.Replace('src\WebApp', ''))
    '$(MSBuildSolutionDirectory)\' 

 $([System.IO.Path]::GetFullPath('$(MSBuildSolutionDirectory)..\packages'))

MSBuild предоставляет путь, содержащий текущий файл проекта в $ (MSBUILDPROECTDirectory) Отказ Поскольку мы знаем связь пути проекта к корню репозитория, мы просто работаем назад, чтобы получить корню репозитория, который я позвонил $ (MsbuildsoluteDirectory) Отказ Оттуда мы объединяем корню репозитория с относительным путем к папке пакетов, а затем получить полный путь (абсолютный путь) результата, сохраняя его в $ (PackagesDir) Отказ Теперь мы делаем поиск .. \ .. \ .. \ пакеты и заменить его с $ (PackagesDir) в файле проекта. Это гарантирует, что вся ссылка на пакет Nuget является абсолютной, когда MSBuild выполняет разрешение зависимостей. Если у вас есть несколько проектов в вашем решении, вам нужно будет повторить этот процесс соответственно.

Смешивание технологий

Одна из странностей, которые я столкнулся с во время миграции нашего приложения Hybrid WebForms-Vue.js, приходилось делать с поведением веб-издательской инструмента Microsoft при публикации на службу Azure App. Этот инструмент используется как TeamCity, так и лазурными трубопроводами, поскольку это метод де-факто для публикации IIS из MSBUILD.

Наше приложение генерирует множество связей JavaScript во время процесса сборки и помещает их в Dist папка в корне проекта WebForms. В прошлом, в том числе этот фрагмент, чтобы получить содержание Dist Папка опубликована.

  
    
  

Около недели назад это довольно работает. Я не изолировал то, что сломалось изменение, но вдруг содержимое Dist Папка больше не была включена в ZIP-файл, генерируемый задачей веб-публикации. Используя окно регистрации сборки в Visual Studio, я смог увидеть, что Содержание Файлы были рассчитаны до того, как был назван Typeycript Compiler, и до того, как WEBPACK поставит пакеты вместе. Во-первых, я попытался обеспечить Dist Папка была создана перед созданием, но это не помогло, пустой Dist Папка была исключена из ZIP-файла. Я поместил файл readme.md в Dist папка и включена в исходное управление. Readme и Dist Папка присутствовала в ZIP-файле, но не пучки. Из чистого отчаяния я заменил вышеуказанный узел этим:

    
      PreserveNewest
    
    
      PreserveNewest
    
    
      PreserveNewest
    

Успех! Пакеты и карты еще раз включены в Zip-файл.

ПРЕДУПРЕЖДЕНИЕ: Оставляя Readme.md вызывает разрешение раннего содержания игнорировать Dist папка.

Заключение

Как и любая другая технология, ASP.NET — это движущаяся цель. Microsoft посвящена исправлениям безопасности для .NET Framework 4.8 на протяжении многих лет, что означает, что всегда есть шанс для чего-то странного для подъема. Минимизация голчаса начинается с миграции всех .NET Рамочные проекты к .NET 4.8. Настаивая на более старых версиях, просто гарантирует, что у вас возникнет проблема раньше, чем позже. Вся глупость связывания ассамблеи в начале этой статьи решается миграцией на .NET 4.8. Если вы админ, переходя к новым версиям из-за чего-либо пугающего вас, и я полностью получаю это, но оставаясь только в прошлом, только означает, что вы далее от реальности каждый день. Получите ваши проектные команды для совершения цели достижения .NET Framework 4.8 рано, а не позже. Оказавшись там, каждый может немного расслабиться и знать, что абсурдная гибкость ASP.NET будет продолжать обслуживать вас в течение многих лет в качестве хорошего гражданина в вашей среде CI/CD.

Оригинал: «https://dev.to/sharpninja/making-a-legacy-asp-net-project-webforms-mvc-or-web-api-more-devops-friendly-46mo»