.NET SMTP работает через dotnet run, но не после publish: что сравнить. Практическая проверка: для одинакового безопасного тестового сообщения сравнить dotnet run опубликованный exe и windows service по жизненному циклу процесса, наличию listener и owning pid, адресу и порту, service identity, content root и загруженной конфигурации, а также.
Сначала зафиксируйте именно этот симптом
В режиме разработки локальный smtp listener принимает соединение, а опубликованный процесс или служба Windows сразу закрывает его, поэтому разработчик рискует менять firewall service account и библиотеку одновременно не доказав жив ли процесс кто слушает порт и загружена ли та же конфигурация. Точный запрос пользователя: почему локальный smtp listener в dotnet backgroundservice работает через dotnet run но опубликованный exe или windows service закрывает соединение и как проверить слой сбоя без угадывания причины. Свежий публичный сигнал описывает границу так: Официальный Stack Exchange API возвращает вопрос Stack Overflow от 26 августа 2026 года: локальный SMTP-listener в BackgroundService работает через dotnet run, но опубликованный exe и Windows Service закрывают соединение. Вопрос подтверждает только сценарий, но не причину. Он подтверждает существование сценария «.NET SMTP работает через dotnet run, но не после publish: что сравнить», но не назначает виновный компонент и не показывает масштаб. До проверки запишите только наблюдаемое: версию, поверхность продукта, момент события и воспроизводимый шаг. Личные имена, адреса, содержимое аккаунта и закрытые ссылки для этого не нужны. Если симптом нельзя повторить на безопасном примере, остановитесь на сборе фактов и не меняйте конфигурацию наугад.
Проверка по отдельным контрольным шагам
Для одинакового безопасного тестового сообщения сравнить dotnet run опубликованный exe и windows service по жизненному циклу процесса, наличию listener и owning pid, адресу и порту, service identity, content root и загруженной конфигурации, а также Event Log; менять по одному фактору и при отсутствии listener или необработанном исключении остановиться и собрать минимизированный runtime пакет без писем и секретов. Разложите эту последовательность на отдельные контрольные действия. Шаг 1: Для одинакового безопасного тестового сообщения сравнить dotnet run опубликованный exe и windows service по жизненному циклу процесса. Шаг 2: Наличию listener и owning pid. Шаг 3: Адресу и порту. Шаг 4: Service identity. Шаг 5: Content root и загруженной конфигурации. Шаг 6: А также Event Log. Шаг 7: Менять по одному фактору и при отсутствии listener или необработанном исключении остановиться и собрать минимизированный runtime пакет без писем и секретов. После каждого шага сохраните ожидаемый и фактический результат, не переходя сразу к следующему. Контрольная переменная для этой статьи — именно «матрица «режим запуска × процесс жив × порт LISTEN × owning PID × identity × content root/config × Event Log» отделяет запуск host от сетевого listener и SMTP-сессии, задаёт обратимый контроль на loopback и стоп-линию перед ослаблением firewall или прав службы». Изменяйте одно условие, затем возвращайте его в исходное состояние. Если различие исчезло после отката и вернулось при повторе, ветка подтверждена наблюдением; если нет, зафиксируйте отрицательный результат и переходите к следующей границе, не расширяя права и не очищая данные.
Границы, которые задают источники
Документ 1: Microsoft Learn показывает штатную регистрацию BackgroundService через AddWindowsService, рекомендуемый publish-процесс, управление службой и проверку её Event Log; успешный статус службы сам по себе не подтверждает наличие TCP-listener. Документ 2: Официальная заметка .NET объясняет различие текущего каталога процессов, запущенных Windows Shell или services.exe, и ContentRootPath, а для .NET 7+ фиксирует fallback к AppContext.BaseDirectory при системном каталоге; это проверяемая граница, не заявленная причина конкретного сбоя. Документ 3: Документация Get-NetTCPConnection подтверждает, что cmdlet показывает LocalAddress, LocalPort, State и OwningProcess, поэтому им можно доказательно разделить отсутствие listener, другой PID и уже установленное соединение. Эти документы подтверждают только перечисленные свойства и ограничения. Их нельзя растягивать на другую версию, роль, платформу или сетевую схему без отдельной проверки. Форумный или новостной сигнал не заменяет документацию: он задаёт вопрос «почему локальный smtp listener в dotnet backgroundservice работает через dotnet run но опубликованный exe или windows service закрывает соединение и как проверить слой сбоя без угадывания причины», а ответ строится по первичным формулировкам выше. Если интерфейс, версия или результат расходятся с документом, отметьте расхождение как неизвестное и приложите к обращению ссылку и дату проверки, а не предположение о причине.
Развилки решения и стоп-линия
Матрица «режим запуска × процесс жив × порт LISTEN × owning PID × identity × content root/config × Event Log» отделяет запуск host от сетевого listener и SMTP-сессии, задаёт обратимый контроль на loopback и стоп-линию перед ослаблением firewall или прав службы. Практическая развилка начинается с результата последовательности: для одинакового безопасного тестового сообщения сравнить dotnet run опубликованный exe и windows service по жизненному циклу процесса, наличию listener и owning pid, адресу и порту, service identity, content root и загруженной конфигурации, а также Event Log; менять по одному фактору и при отсутствии listener или необработанном исключении остановиться и собрать минимизированный runtime пакет без писем и секретов. Если первый обратимый тест меняет симптом, повторите его на исходном состоянии и сохраните обе строки сравнения. Если результат одинаков, не делайте вывод о поломке всего продукта — переходите к следующему слою, названному в матрице для «.NET SMTP работает через dotnet run, но не после publish: что сравнить». Стоп-линия наступает перед удалением профиля, сбросом, выдачей широких разрешений, ослаблением защиты или изменением чужих данных. Минимальный пакет поддержки: обезличенный симптом, версия клиента и ОС, UTC-время, выбранная ветка, одно изменённое условие, ожидаемый и фактический результат. Пароли, токены, IP-адреса, серийные номера и полные логи исключите.
Материал подготовлен редакцией VOne с применением ИИ для структурирования дерева проверки, но каждый технический тезис вручную сопоставлен с указанными официальными, первичными или исследовательскими источниками; форумный либо новостной сигнал использован только как лид и не считается доказательством причины или популярности.
Источники и проверка
- learn.microsoft.com — проверенный источник проверено 2026-08-27
- learn.microsoft.com — проверенный источник проверено 2026-08-27
- learn.microsoft.com — проверенный источник проверено 2026-08-27
Информация актуальна на дату публикации. Правила сервисов, приложений и сетей могут меняться.