Я хочу отладить сервис, записанный в C#, и старомодный путь является просто слишком длинным. Я должен остановить сервис, запустить мое приложение, которое использует сервис в режиме отладки (Visual Studio 2008), запустите сервис, присоедините к сервису, обрабатывают и затем перешли у моего Asp. Сетевое приложение для инициирования сервиса.
У меня в основном есть сервис, работающий в фоновом режиме, ожидая задачи. Веб-приложение инициирует задачу, которая будет взята сервисом.
То, что я хотел бы сделать, должно иметь консольное приложение, которое запускает сервис в усилие для меня отладить. Есть ли какая-либо простая демонстрация, о которой кто-либо знает?
Вы можете сделать что-то вроде этого в основной точке входа:
static void Main()
{
#if DEBUG
Service1 s = new Service1();
s.Init(); // Init() is pretty much any code you would have in OnStart().
#else
ServiceBase[] ServicesToRun;
ServicesToRun=new ServiceBase[]
{
new Service1()
};
ServiceBase.Run(ServicesToRun);
#endif
}
и в обработчике событий OnStart:
protected override void OnStart(string[] args)
{
Init();
}
Подход, который я всегда использую, заключается в том, чтобы изолировать всю логику вашего приложения в библиотеках классов. Это делает ваш сервисный проект действительно просто оболочкой, в которой ваши библиотеки классов размещаются как сервис.
Делая это, вы можете легко тестировать и отлаживать свой код без необходимости иметь дело с головной болью отладки службы путем присоединения к процессу. Я бы порекомендовал, конечно, модульное тестирование, но если вы этого не делаете, то лучшим вариантом будет добавление консольного приложения, которое вызывает ту же точку входа, что и ваша служба.
Вот запись в блоге о запуске службы Windows в качестве консольного приложения.
Вы также можете просто создать новое консольное приложение, которое ссылается на ту же логику, что и ваша служба, для методов тестирования или настроить модульные тесты для логики ваших служб
В прошлом я использовал модульные тесты для отладки сложных настроек, просто напишите модульный тест, который вызывает любой метод службы с любыми параметрами и устанавливает точки останова отладки в модульном тесте.
Использование testdriven.net или тестраннера jetbrains делает это проще.
Возможно, вам захочется проверить TopShelf в своих приключениях.
http://codebetter.com/blogs/dru.sellers/archive/2009/01/11/topshelf.aspx
Для отладочных сборок я обычно использую либо настройку конфига, либо директиву:
#if DEBUG
Debugger.Break();
#endif
или
if(Settings.DebugBreak)
Debugger.Break();
Я помещаю это в метод OnStart компонента службы. Тогда вы получаете автоматический запрос и подключаетесь к процессу.