необработанное исключение приведет к сбою службы WCF? - PullRequest
7 голосов
/ 16 июля 2009

Я хочу знать, приведет ли необработанное исключение к сбою службы WCF. Я написал следующую программу, которая показывает необработанное исключение в потоке, запущенном службой WCF, и приведет к краху всей службы WCF.

У меня вопрос: я хочу подтвердить, приведет ли необработанное исключение в потоках (запущенное службой WCF) к сбою WCF? Я путаюсь с мнением, что WCF должен быть стабильным сервисом, который не должен зависать из-за необработанного исключения.

Я использую VSTS 2008 + C # + .Net 3.5 для разработки собственной службы WCF на основе Windows Service.

Вот соответствующие части кода,

namespace Foo
{
    // NOTE: If you change the interface name "IService1" here, you must also update the reference to "IService1" in Web.config.
    [ServiceContract]
    public interface IFoo
    {
        [OperationContract]
        string Submit(string request);
    }
}

namespace Foo
{
    // NOTE: If you change the class name "Service1" here, you must also update the reference to "Service1" in Web.config and in the associated .svc file.
    public class FooImpl : IFoo
    {
        public string Submit(string request)
        {
            return String.Empty;
        }
    }
}

namespace Foo
{
    public partial class Service1 : ServiceBase
    {
        public Service1()
        {
            InitializeComponent();
        }

        ServiceHost host = new ServiceHost(typeof(FooImpl));

        protected override void OnStart(string[] args)
        {
            host.Open();
            // start a thread which will throw unhandled exception
            Thread t = new Thread(Workerjob);
            t.Start();
        }

        protected override void OnStop()
        {
            host.Close();
        }

        public static void Workerjob()
        {
            Thread.Sleep(5000);
            throw new Exception("unhandled");
        }
    }
}

Ответы [ 6 ]

18 голосов
/ 16 июля 2009

Необработанное исключение на стороне обслуживания приведет к "отказу" канала (соединение между клиентом и сервером) - например, быть снесенным.

С этого момента вы больше не можете звонить с клиента, используя тот же экземпляр объекта прокси-клиента - вам придется заново создать прокси-клиент.

Лучше всего по возможности обрабатывать все ошибки на стороне сервера. Посмотрите интерфейс IErrorHandler , который вы должны реализовать в своем классе реализации службы, чтобы превратить все необработанные исключения .NET в ошибки SOAP (которые NOT вызовут сбой канала) или сообщить / проглотить их полностью.

Марк

11 голосов
/ 16 июля 2009

Да, необработанное исключение в потоке остановит процесс.

Этот процесс завершится с ошибкой:

static void Main(string[] args)
{
    Thread t = new Thread(() =>
    {
        throw new NullReferenceException();
    });
    t.Start();
    Console.ReadKey();
}

Этот не будет:

static void Main(string[] args)
{
    Thread t = new Thread(() =>
    {
        try
        {
            throw new NullReferenceException();
        }
        catch (Exception exception)
        {
            Console.WriteLine(exception.ToString());
        }
    });
    t.Start();
    Console.ReadKey();
}
7 голосов
/ 28 декабря 2009

Поведение среды выполнения WCF по умолчанию - проглатывать все исключения, кроме нескольких. Поэтому, если ваш код выбрасывает исключение в стек во время выполнения WCF (например, если вы выбрасываете из операции WCF), это НЕ приведет к аварийному завершению приложения (если оно не считается «фатальным» исключением, таким как OOM, SEHException и т. Д.). .). Если исключение не является частью договора об ошибке операции, то канал будет неисправен, в противном случае нет.

Если среда выполнения WCF не соответствует вашему коду в стеке, исключение / вызовет / приведет к сбою процесса.

Это похоже на среду выполнения ASP.NET.

Если вы хотите проверять исключения, вылетающие из операций WCF, я рекомендую использовать интерфейс IOperationInvoker. Вы также можете использовать IErrorHandler, но ваша реализация IErrorHandler будет уведомлена об исключениях, отличных от тех, которые вызываются из «пользовательского кода» (операции WCF), таких как SocketAbortedExceptions во внутренних потоках ввода-вывода WCF, которые, вероятно, вам не интересны.

3 голосов
/ 16 июля 2009

Если вы не обработаете исключение, оно будет передано операционной системе, и оно отреагирует уничтожением того приложения, которое вызвало исключение.

Почему бы вам просто не добавить try / catch для обработки исключений, чтобы ваш сервис не был убит?

1 голос
/ 28 августа 2012

Вы можете использовать FaultException для сообщения об ошибках клиентской стороне и сохранения логики в сервисе.

Проверьте это пример , надеюсь, это поможет вам.

1 голос
/ 16 июля 2009

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

try{//do something
}
catch{ //handle errors
}
finally{//final clean up
}

блок в вашем коде, чтобы удостовериться, что если он выдает исключение, это обрабатывает его изящно примеры на http://msdn.microsoft.com/en-us/library/fk6t46tz(VS.71).aspx

...