c# - 如何防止WCF服務進入故障狀態?




.net msmq (4)

例外將導致代理錯誤。 你不能AFAIK做很多事情:不要引起例外;-p

我有點驚訝,單向仍然會導致問題,但對於吞嚥,有三個方面:

  1. 你在拋出faults嗎? 或例外? 這很重要(應該是“缺點”)
  2. 作為一個黑客,您可以啟用調試異常消息 - 但請關閉它!
  3. 你在“使用”服務對象嗎? 我剛剛在這個確切的主題上寫了blogged ...基本上,你的“使用”可以吞下這個例外。 3個選項:

    • 不要使用“使用”
    • 子類代理並重寫Dispose()
    • 根據博客包裝它

我有一個不應該進入故障狀態的WCF服務。 如果存在異常,則應記錄該異常,並且服務應繼續不間斷。 該服務具有單向操作合同,並且正在從MSMQ讀取消息。

我的問題有兩個:

  1. 該服務似乎吞噬了異常/錯誤,因此我無法對其進行調試。 如何讓服務公開異常,以便我可以記錄或處理它?
  2. 吞下此異常後,服務進入故障狀態。 如何防止服務進入故障狀態?

在WCF跟踪( 配置跟踪 )中可以看到大多數(如果不是全部)異常,並且最好使用服務跟踪查看器查看跟踪

顯然,這不是你應該在生產環境中整天運行的東西,但無論如何它都有助於排除故障。

除此之外,請注意,根據您使用的SessionMode,始終可能不會像真正的“火與忘記”一樣運行。 如果您為SessionMode.Allowed或甚至SessionMode.Required配置了服務,則單向操作將運行,就好像它根本不是單向操作(當在netTcpBinding上單獨使用時可以觀察到這一點)。 坦率地說,我不知道這是否會改變您可以獲得的例外類型,或者當您獲得它們時。 但是,在任何情況下,如果請求根本無法發送,則應該收到異常。 AFAIK,在服務器端成功啟用時,單向“結束”。 因此,在那之前(WCF框架相關)異常有一些地方(想到序列化/反序列化)。

然後,最好看到這樣的框架相關異常(即使IErrorHandler因使用上述跟踪/跟踪查看器在請求/響應流中調用它而無法全部獲取它們)。



通常,WCF服務託管在ServiceHost中,如果WCF服務失敗,則唯一的選擇是終止WCF服務並啟動新服務。

ServiceHost有一個事件觸發器“Faulted”,在WCF服務失敗時激活:

ServiceHost host = new ServiceHost(new Service.MyService());
host.Faulted += new EventHandler(host_faulted);
host.Open();

可能會導致導致錯誤的異常,但需要更多工作:

public class ErrorHandler : IErrorHandler
{
    public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
    {

    }

    public bool HandleError(Exception error)
    {
        Console.WriteLine("exception");
        return false;
    }
}

public class ErrorServiceBehavior : IServiceBehavior
{
    public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
    {

    }

    public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
    {

    }

    public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
    {
        ErrorHandler handler = new ErrorHandler();
        foreach (ChannelDispatcher dispatcher in serviceHostBase.ChannelDispatchers)
        {
            dispatcher.ErrorHandlers.Add(handler);
        }
    }
}

ServiceHost host = new ServiceHost(new Service.MyService());
host.Faulted += new EventHandler(host_faulted);
host.Description.Behaviors.Add(new ErrorServiceBehavior());
host.Open();

積分http://www.haveyougotwoods.ca/2009/06/24/creating-a-global-error-handler-in-wcf







msmq