Критическая ошибка в службе WCF - PullRequest
0 голосов
/ 26 ноября 2009

Я размещаю службу WCF в консольном приложении (временно, я перейду к службе позже. Используя учетную запись администратора). После нескольких часов выполнения я получаю Critical Error из консоли (HOST), и моя служба перестает работать. Какой лучший способ отследить ошибку? Я пробовал код ниже, чтобы зарегистрировать ошибку, но кажется, что код не перехватывает ошибку. Я думаю, что мне нужно обрабатывать ошибки внутри службы WCF, а не в хост-приложении. Есть предложения?

namespace ConsoleApplication1
{
    //test host project
    class Program
    {
        static void Main(string[] args)
        {                     

            using (var serviceHost = new ServiceHost(new ServicePdf()))
            {
                try
                {                    
                    serviceHost.Open();
                    Console.WriteLine("Service was succesfully hosted. Press [enter] to exit...");
                    Console.ReadLine();                    
                }
                catch (Exception ex)
                {                    
                    MethodToLogError(ex);
                    Console.WriteLine("Error occured while hosting service. Press [enter] to exit...");
                    Console.WriteLine(ex.Message);
                    Console.ReadLine();
                }
            }
        }
    }
}

С уважением, Tomas

Ответы [ 3 ]

1 голос
/ 27 ноября 2009

Вы можете попробовать включить трассировку WCF и ведение журнала сообщений.

http://mkdot.net/blogs/dejan/archive/2008/10/23/wcf-tracing-and-message-logging.aspx

Затем воспользуйтесь приложением Service trace View для просмотра файла.

1 голос
/ 26 ноября 2009

Вы можете перехватить любое необработанное исключение на вашем хосте (из основного потока или любого другого потока), добавив событие AppDomain.UnhandledException.

static void Main(string[] args)
        {  
            //...
            AppDomain.CurrentDomain.UnhandledException += exceptionHandler;
            //...
}

static void exceptionHandler(object sender, UnhandledExceptionEventArgs args) 
{
      Exception e = (Exception) args.ExceptionObject;
      Console.WriteLine("An unhandledexception occurred. Time to die. " + e);
}

Таким образом, вы регистрируете исключение. Однако нет способа изящно оправиться от этого.

0 голосов
/ 27 ноября 2009

Если это происходит через несколько часов, это звучит как утечка ресурсов. Используя Process Explorer, проверьте использование памяти приложением; все, что больше пары сотен мегабайт, обычно подразумевает проблему.

Прослеживание этого - искусство само по себе; часто требуется сеанс с Windebug. Обычно это неизданный ресурс (в службе WCF, проверьте код базы данных) или проблема с обработчиками событий.

...