Отладка расширений с брейкпоинтами
Инструкция для разработчика расширений Portal: WebPart, Event Receiver, Timer Job, provisioner модуля.
Нужны установленный Portal и Extension SDK той же версии — SDK для сборки вашего расширения.
┌──────────────────────────────────────────────────────────┐│ Установленный Portal ││ Api загружает вашу WebPart / provisioner ││ Worker загружает Event Receiver / Timer Job │└──────────────────────────────────────────────────────────┘ │ Attach (если канал установки позволяет) ▼┌──────────────────────────────────────────────────────────┐│ IDE: проект расширения + PDB ││ брейкпоинт в вашем .cs → Stop при вызове │└──────────────────────────────────────────────────────────┘Что понадобится
Заголовок раздела «Что понадобится»- .NET SDK 10 (тот же major, что у Portal) —
dotnet --version. - IDE с Attach к .NET-процессу (Rider, Visual Studio, VS Code + C#).
- Extension SDK той же версии, что Portal (NuGet, примеры, скрипты
pack-*). - Экземпляр Portal, куда можно ставить пакеты (предпочтительно staging / dev).
- Права ставить расширения в админке (и при Attach — доступ к процессу Api/Worker на сервере или к Docker-хосту).
Какой процесс «держит» ваш код
Заголовок раздела «Какой процесс «держит» ваш код»| Тип расширения | Процесс Portal | Как спровоцировать hit |
|---|---|---|
| WebPart | Api | Открыть / обновить страницу с WebPart, action WebPart |
| Module provisioner | Api | Установить / переустановить .portalmod |
| Event Receiver | Worker | Создать / изменить элемент списка (событие → job) |
| Timer Job | Worker | Run в админке или дождаться расписания |
К процессу Api или Worker подключаетесь через Attach в IDE.
Основной сценарий: Debug-пакет + Attach
Заголовок раздела «Основной сценарий: Debug-пакет + Attach»Шаг 1. Соберите пакет с символами
Заголовок раздела «Шаг 1. Соберите пакет с символами»Скрипты — из Extension SDK (или копии pack-*.sh / pack-*.ps1 рядом с проектом). По умолчанию Release; для брейкпоинтов нужен Debug (в ZIP попадут .dll и .pdb):
CONFIGURATION=Debug ./pack-portalpart.sh ./my-widgetCONFIGURATION=Debug ./pack-portalevent.sh ./my-handlerCONFIGURATION=Debug ./pack-portaltimer.sh ./my-jobCONFIGURATION=Debug ./pack-portalmod.sh ./my-modulePowerShell: -Configuration Debug.
Увеличьте version в manifest.json / module.json, если переустанавливаете поверх уже установленного пакета.
Шаг 2. Установите пакет в Portal
Заголовок раздела «Шаг 2. Установите пакет в Portal»Как обычно: Админка (WebParts / Event Receivers / Timer Jobs / Модули) или API установки пакета.
Перезапуск Api/Worker для hot deploy не нужен — см. Hot deploy.
После загрузки файлы расширения оказываются в каталоге вида:
%TEMP%/portal-plugins/{key}/{contentHash}/
рядом лежат DLL и PDB — отладчик подхватит символы оттуда (пути зависят от ОС и канала установки).
Шаг 3. Attach в IDE
Заголовок раздела «Шаг 3. Attach в IDE»- Откройте в IDE проект вашего расширения (не платформу).
- Поставьте брейкпоинт в серверном C#-коде.
- Debug → Attach to Process (формулировка зависит от IDE) к нужному процессу — см. таблицу по каналам ниже.
- Спровоцируйте hit (страница, событие списка, Run job).
Шаг 4. По каналам установки
Заголовок раздела «Шаг 4. По каналам установки»| Канал | Брейкпоинты (Attach) | Рабочий способ отладки |
|---|---|---|
| Native Linux / Windows | Да — Attach к службе Api/Worker | Debug-пакет + Attach (см. ниже) |
| Docker Compose | Нет «из коробки» | Логи + hot deploy |
| Kubernetes | Нет «из коробки» | Логи + hot deploy |
Узнать канал: выбор установки, install.mode в каталоге данных или экран лицензии.
Пример: WebPart на Native Linux
Заголовок раздела «Пример: WebPart на Native Linux»CONFIGURATION=Debug ./pack-portalpart.sh ./my-widget# установить .portalpart в админке (version ↑)systemctl status portal-api # PID → Attach в IDE# браузер — страница с WebPartПример: Event Receiver / Timer Job
Заголовок раздела «Пример: Event Receiver / Timer Job»Attach к Worker, не к Api. После установки Debug-пакета — событие списка или Run Timer Job.
Docker и Kubernetes: как отлаживать
Заголовок раздела «Docker и Kubernetes: как отлаживать»Штатные образы portal/api и portal/worker — Production, без отладчика (vsdbg).
Поэтому сценарий «Debug-пакет → Attach из Rider/VS» на Docker/K8s не поддерживается.
Рекомендуемый цикл (основной)
Заголовок раздела «Рекомендуемый цикл (основной)»Тот же hot deploy, что и в проде: пакет ставится в работающий Portal без рестарта контейнеров/подов.
- В коде расширения пишите диагностику через лог SDK (
api.Log.Info,Error, … — см. SDK WebPart / ER / Timer Job). - Соберите пакет (
CONFIGURATION=Debugне обязателен, если брейкпоинты недоступны; для единообразия можно Debug). - Установите / обновите пакет в админке (увеличьте
version). - Воспроизведите сценарий в браузере.
- Смотрите логи:
Docker Compose (из каталога установки):
docker compose logs -f backend # WebPart, provisionerdocker compose logs -f worker # Event Receiver, Timer JobKubernetes (namespace часто portal, имена могут отличаться — kubectl get pods -n portal):
kubectl logs -n portal -l app.kubernetes.io/component=backend -f --tail=200kubectl logs -n portal -l app.kubernetes.io/component=worker -f --tail=200- Правка → снова pack → установка → повтор.
Это штатный и поддерживаемый способ отладки расширений на Docker/K8s.
Отдельный staging (тот же канал)
Заголовок раздела «Отдельный staging (тот же канал)»Не отлаживайте на боевом проде. Поднимите второй экземпляр Portal того же канала (docker или k8s) — отдельная БД/данные, своя лицензия на инсталляцию (лицензии: канал должен совпадать).
На staging тот же цикл «пакет + логи»; брейкпоинты по-прежнему недоступны без отладчика в образе.
Перенос на Native ради Attach возможен только с лицензией канала native (ключ Docker/K8s на Native не подойдёт — LICENSE_CHANNEL_MISMATCH).
Чего не делать
Заголовок раздела «Чего не делать»- Не рассчитывать на Attach к контейнеру/поду со штатным образом.
- Не ставить самодельный
vsdbgв Production-образ на бою без понимания рисков (неподдерживаемый путь; при необходимости — только на изолированном staging и на свой страх).
Подробнее про обновление пакета: WebParts CLI, Hot deploy.
Логи на Native (дополнительно к Attach)
Заголовок раздела «Логи на Native (дополнительно к Attach)»На Native удобнее Attach; логи всё равно полезны:
| Канал | Api | Worker |
|---|---|---|
| Native Linux | journalctl -u portal-api -f | journalctl -u portal-worker -f |
| Native Windows | Журнал / вывод PortalApi | PortalWorker |
Частые проблемы
Заголовок раздела «Частые проблемы»| Симптом | Что проверить |
|---|---|
| Брейкпоинт не срабатывает / «пустой» | Пакет собран Debug с PDB; версия в манифесте увеличена и пакет переустановлен; Attach к тому процессу (Api vs Worker); после hot-reload иногда нужно отключить Attach и подключить снова |
| Attach не видит процесс | На Native — права/не тот хост; на Docker/K8s Attach со штатным образом не поддерживается — см. логи |
| Старое поведение после установки | Жёсткое обновление страницы (CSS/JS с ?v=); для Worker — дождаться reload по Valkey или проверить логи Worker |
| На Docker/K8s нет брейкпоинтов | Ожидаемо. Цикл: логи SDK → pack → установка → docker compose logs / kubectl logs |
Ограничения
Заголовок раздела «Ограничения»- Release-сборка с оптимизациями часто ломает точное попадание в строки — для брейкпоинтов собирайте Debug.
- Hot-redeploy выгружает collectible ALC; после переустановки пакета символы перезагружаются — при необходимости переподключите Attach.
- Штатные Docker/K8s-образы Api/Worker не предназначены для отладки из IDE (нет vsdbg).
Чеклист
Заголовок раздела «Чеклист»- SDK той же версии, что Portal
- Пакет собран и установлен / обновлён (
version↑) - Native: Debug + PDB → Attach к Api или Worker
- Docker / K8s: логи в коде →
docker compose logs/kubectl logs→ цикл pack → установка