【问题标题】:How to throw FaultException from self hosting wcf service?如何从自托管 wcf 服务中抛出 FaultException?
【发布时间】:2011-04-09 18:21:52
【问题描述】:

我打算在windows服务中托管服务,但我正在考虑标题中描述的问题。有人有类似的问题吗? 谢谢

更新

问题是当你在 WinForms/WPF/Win Service 应用程序中抛出异常时,程序会崩溃,你必须重新启动它。

【问题讨论】:

  • 也许你可以详细说明问题到底是什么。
  • 您是否尝试抛出一个新异常作为对服务中某些验证规则的回答,希望客户端能够捕获并处理它?
  • 你试过 catch (FaultException) 块了吗?
  • @Laurent 是的,这就是我想要做的。我可以在 IIS 中托管服务,但它会加强部署。如果可以实现我想要的,我更喜欢Windows Service
  • 这里问了同样的问题:stackoverflow.com/questions/1369882/… - 他们谈论 Web WCF 服务,你是按照这个答案解释的方式做的吗? stackoverflow.com/questions/1369882/…

标签: c# wcf fault self-hosting


【解决方案1】:

异常并不总是会使您的服务器崩溃。即使是意外的服务器端异常也会转移到客户端。它被认为比预期的更严重,导致通道故障。

基本思想是在你的接口契约中包含预期的异常(错误)。有很多方法可以做到这一点,这里是an introduction article

当然,您需要在服务器上进行适当的异常处理。

【讨论】:

  • 嗯,那篇文章提到要捕获异常并抛出 FaultException(try catch 不处理)。实际上这是我想做的,但这不会使服务崩溃吗?我想唯一的方法是在将 FaultException 转发给客户端后捕获它。你知道怎么做吗?谢谢
  • 试试吧。 WCF 将对其进行编码并在客户端上再次引发它。
【解决方案2】:

您可以尝试通过在主机应用程序的 Main 方法入口点中挂钩 ThreadException 事件来拦截任何异常,以检查它是否是 FaultException。

static class Program
{
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());

        // Hook to this event below
        Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
    }

    static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
    {
        if (e.Exception is FaultException)
            return; // Bypass FaultExceptions;
        else
            throw e.Exception; // Throw otherwise
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多