繁体   English   中英

未处理的异常会使WCF服务崩溃吗?

[英]unhandled exception will make WCF service crash?

我想知道未处理的异常是否会使WCF服务崩溃。 我编写了以下程序,该程序显示WCF服务启动的线程中未处理的异常将使整个WCF服务崩溃。

我的问题是,我想确认线程中未处理的异常(由WCF服务启动)是否会使WCF崩溃? 我的困惑是,我认为WCF应该是稳定的服务,不应因未处理的异常而崩溃。

我正在使用VSTS 2008 + C#+ .Net 3.5开发基于WCF服务的自托管Windows服务。

这是代码的相关部分,

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");
        }
    }
}

服务端未处理的异常将导致通道(客户端和服务器之间的连接)“发生故障”,例如被拆除。

从那时起,您将无法再使用相同的代理客户端对象实例从客户端进行调用-您将不得不重新创建代理客户端。

最好的选择是尽可能处理服务器端的所有错误。 检出应该在服务实现类上实现的IErrorHandler接口,以将所有未处理的.NET异常转换为SOAP错误( 不会导致通道故障),或者完全报告/吞噬它们。

是的,线程中未处理的异常会导致进程中断。

此过程将崩溃:

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();
}

WCF运行时的默认行为是吞入除少数几种类型之外的所有异常。 因此,如果您的代码向WCF运行时抛出了异常(例如,从WCF操作中抛出),则它不会使应用程序崩溃(除非它被视为“致命”异常,例如OOM,SEHException等) )。 如果异常不是操作故障合同的一部分,则通道将发生故障,否则就不会发生故障。

如果WCF运行时不在堆栈上的代码下,则异常/ will /将使进程崩溃。

这类似于ASP.NET运行时。

如果您希望以一般方式筛选出WCF操作中溢出的异常,建议使用IOperationInvoker界面。 您也可以使用IErrorHandler,但是将向IErrorHandler实现通知除“用户代码”(WCF操作)引发的异常以外的其他异常,例如WCF内部I / O线程上的SocketAbortedException,这些异常可能对您而言并不有趣。

如果您不处理异常,它将在操作系统上传递,并且它将通过杀死导致该异常的应用程序做出响应。

您为什么不只添加try / catch来处理异常,以使服务不会被杀死?

如果没有适当的错误处理,它将使程序崩溃。 好的做法是

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

在您的代码中进行阻止,以确保是否确实引发了异常。 http://msdn.microsoft.com/zh-cn/library/fk6t46tz(VS.71).aspx上的示例

您可以使用FaultException将错误传达给客户端,并将逻辑保留在服务中。

检查此示例 ,希望对您有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM