共用方式為


延伸對錯誤處理和報告的控制

這個範例示範如何使用 IErrorHandler 介面延伸對 Windows Communication Foundation (WCF) 服務中錯誤處理與錯誤報告的控制。這個範例以使用者入門範例為基礎,另外在服務上增加了一些其他程式碼來處理錯誤。用戶端會強制產生數個錯誤狀況。服務則攔截這些錯誤並記錄在檔案中。

ms751439.note(zh-tw,VS.90).gif注意:
此範例的安裝程序與建置指示位於本主題的結尾。

服務可以使用 IErrorHandler 介面來攔截錯誤、進行處理,並影響報告錯誤的方式。這個介面有兩個可加以實作的方法:ProvideFaultHandleErrorProvideFault 方法可讓您新增、修改或隱藏回應例外狀況所產生的錯誤訊息。HandleError 方法可以在發生錯誤時進行錯誤處理,並控制是否可以執行其他錯誤處理。

在這個範例中,CalculatorErrorHandler 型別會實作 IErrorHandler 介面。在

HandleError 方法中,CalculatorErrorHandler 會將錯誤記錄寫入 c:\logs 中的 Error.txt 文字檔。請注意,此範例會記錄錯誤,但不加以隱藏,目的是為了將該錯誤回報到用戶端。

public class CalculatorErrorHandler : IErrorHandler
{
        // Provide a fault. The Message fault parameter can be replaced, or set to
        // null to suppress reporting a fault.

        public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
        {
        }

        // HandleError. Log an error, then allow the error to be handled as usual.
        // Return true if the error is considered as already handled

        public bool HandleError(Exception error)
        {
            using (TextWriter tw = File.AppendText(@"c:\logs\error.txt"))
            {
                if (error != null)
                {
                    tw.WriteLine("Exception: " + error.GetType().Name + " - " + error.Message);
                }
                tw.Close();
            }
            return true;
        }
    }

ErrorBehaviorAttribute 是向服務註冊錯誤處理常式的機制。這個屬性接受單一型別參數。此型別必須實作 IErrorHandler 介面,而且必須具有空的公用建構函式。屬性會接著產生錯誤處理常式型別執行個體的實體,然後將它安裝到服務中。而方式是實作 IServiceBehavior 介面,然後再使用 ApplyDispatchBehavior 方法將錯誤處理常式的執行個體新增至服務。

// This attribute can be used to install a custom error handler for a service.
public class ErrorBehaviorAttribute : Attribute, IServiceBehavior
{
    Type errorHandlerType;

    public ErrorBehaviorAttribute(Type errorHandlerType)
    {
        this.errorHandlerType = errorHandlerType;
    }

    void IServiceBehavior.Validate(ServiceDescription description, ServiceHostBase serviceHostBase)
    {
    }

    void IServiceBehavior.AddBindingParameters(ServiceDescription description, ServiceHostBase serviceHostBase, System.Collections.ObjectModel.Collection<ServiceEndpoint> endpoints, BindingParameterCollection parameters)
    {
    }

    void IServiceBehavior.ApplyDispatchBehavior(ServiceDescription description, ServiceHostBase serviceHostBase)
    {
        IErrorHandler errorHandler;

        try
        {
            errorHandler = (IErrorHandler)Activator.CreateInstance(errorHandlerType);
        }
        catch (MissingMethodException e)
        {
            throw new ArgumentException("The errorHandlerType specified in the ErrorBehaviorAttribute constructor must have a public empty constructor.", e);
        }
        catch (InvalidCastException e)
        {
            throw new ArgumentException("The errorHandlerType specified in the ErrorBehaviorAttribute constructor must implement System.ServiceModel.Dispatcher.IErrorHandler.", e);
        }

        foreach (ChannelDispatcherBase channelDispatcherBase in serviceHostBase.ChannelDispatchers)
        {
            ChannelDispatcher channelDispatcher = channelDispatcherBase as ChannelDispatcher;
            channelDispatcher.ErrorHandlers.Add(errorHandler);
        }                                                
    }
}

這個範例會實作一個計算機服務。用戶端刻意將不合法的值提供給參數,導致服務上發生兩個錯誤。CalculatorErrorHandler 使用 IErrorHandler 介面將錯誤記錄到本機檔案,然後讓這些錯誤回報至用戶端。用戶端便會強制產生「除以零」和「引數超出範圍」的狀況。

try
{
    Console.WriteLine("Forcing an error in Divide");
    // Call the Divide service operation - trigger a divide by 0 error.
    value1 = 22;
    value2 = 0;
    result = proxy.Divide(value1, value2);
    Console.WriteLine("Divide({0},{1}) = {2}", value1, value2, result);
}
catch (FaultException e)
{
    Console.WriteLine("FaultException: " + e.GetType().Name + " - " + e.Message);
}
catch (Exception e)
{
    Console.WriteLine("Exception: " + e.GetType().Name + " - " + e.Message);
}

當您執行範例時,作業要求和回應會顯示在用戶端主控台視窗中。您將會看到其中已將「除以零」和「引數超出範圍」的狀況回報為錯誤。在用戶端視窗中按下 ENTER 鍵,即可關閉用戶端。

Add(15,3) = 18
Subtract(145,76) = 69
Multiply(9,81) = 729
Forcing an error in Divide
FaultException: FaultException - Invalid Argument: The second argument must not be zero.
Forcing an error in Factorial
FaultException: FaultException - Invalid Argument: The argument must be greater than zero.

Press <ENTER> to terminate client.

c:\logs\errors.txt 檔案包含服務所記錄關於錯誤的資訊。請注意,為了讓服務能寫入目錄,您必須確定執行服務的處理序 (通常是 ASP.NET 或網路服務) 擁有寫入該目錄的權限。

Fault: Reason = Invalid Argument: The second argument must not be zero.
Fault: Reason = Invalid Argument: The argument must be greater than zero.

若要設定、建置及執行範例

  1. 請確定您已執行 Windows Communication Foundation 範例的單次安裝程序

  2. 若要建置方案,請遵循建置 Windows Communication Foundation 範例中的指示。

  3. 確定您已為 error.txt 檔案建立 c:\logs 目錄。或者,修改 CalculatorErrorHandler.HandleError 中使用的檔案名稱。

  4. 若要在單一或跨電腦的組態中執行本範例,請遵循執行 Windows Communication Foundation 範例中的指示。

Send comments about this topic to Microsoft.
© 2007 Microsoft Corporation. All rights reserved.