Bagikan melalui


Memperluas Kontrol Atas Penanganan dan Pelaporan Kesalahan

Sampel ErrorHandling menunjukkan cara memperluas kontrol atas penanganan kesalahan dan pelaporan kesalahan dalam layanan Windows Communication Foundation (WCF) menggunakan antarmuka IErrorHandler. Sampel didasarkan pada Memulai dengan beberapa kode tambahan yang ditambahkan ke layanan untuk menangani kesalahan. Klien memaksa beberapa kondisi kesalahan. Layanan ini mencegat kesalahan dan mencatatnya dalam file.

Catatan

Prosedur penyiapan dan petunjuk pembuatan untuk sampel ini terdapat di akhir topik ini.

Layanan dapat mencegat kesalahan, melakukan pemrosesan, dan memengaruhi bagaimana kesalahan dilaporkan menggunakan antarmuka IErrorHandler. Antarmuka memiliki dua metode yang dapat diimplementasikan: ProvideFault(Exception, MessageVersion, Message) dan HandleError. Metode ProvideFault(Exception, MessageVersion, Message) memungkinkan Anda untuk menambahkan, memodifikasi, atau menekan pesan kesalahan yang dihasilkan sebagai respons terhadap pengecualian. Metode HandleError memungkinkan pemrosesan kesalahan terjadi jika terjadi kesalahan dan mengontrol apakah penanganan kesalahan tambahan dapat berjalan.

Dalam sampel ini, jenis CalculatorErrorHandler mengimplementasikan antarmuka IErrorHandler. dalam

Metode HandleError, CalculatorErrorHandler menulis log kesalahan ke file teks Error.txt di c:\logs. Perhatikan bahwa sampel mencatat kesalahan dan tidak menekannya, memungkinkannya dilaporkan kembali ke klien.

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 hadir sebagai mekanisme untuk mendaftarkan penanganan kesalahan dengan layanan. Atribut ini mengambil parameter jenis tunggal. Jenis tersebut harus mengimplementasikan antarmuka IErrorHandler dan harus memiliki konstruktor publik dan kosong. Atribut kemudian membuat instans jenis penanganan kesalahan tersebut dan memasang ke dalam layanan. Ini dilakukan dengan mengimplementasikan antarmuka IServiceBehavior dan kemudian menggunakan metode ApplyDispatchBehavior untuk menambahkan instans penanganan kesalahan ke layanan.

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

Sampel mengimplementasikan layanan kalkulator. Klien sengaja menyebabkan dua kesalahan terjadi pada layanan dengan memberikan parameter dengan nilai ilegal. CalculatorErrorHandler menggunakan antarmuka IErrorHandler untuk mencatat kesalahan ke file lokal dan kemudian memungkinkannya untuk dilaporkan kembali ke klien. Klien memaksa membagi dengan nol dan kondisi argumen di luar rentang.

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

Saat Anda menjalankan sampel, permintaan dan respons operasi ditampilkan di jendela konsol klien. Anda melihat pembagian berdasarkan nol dan kondisi argumen di luar rentang yang dilaporkan sebagai kesalahan. Tekan ENTER di jendela klien untuk mematikan komputer klien.

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.

File c:\logs\errors.txt berisi informasi yang dicatat tentang kesalahan oleh layanan. Perhatikan bahwa agar layanan menulis ke direktori, Anda harus memastikan bahwa proses di mana layanan berjalan (biasanya ASP.NET atau Layanan Jaringan) memiliki izin untuk menulis ke direktori.

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

Untuk menyiapkan, membangun, dan menjalankan sampel

  1. Pastikan Anda telah melakukan Prosedur Penyiapan Satu Kali untuk Sampel Windows Communication Foundation.

  2. Untuk membangun solusi, ikuti instruksi dalam Membangun Sampel Windows Communication Foundation.

  3. Pastikan Anda telah membuat direktori c:\logs untuk file error.txt. Atau ubah nama file yang digunakan dalam CalculatorErrorHandler.HandleError.

  4. Untuk menjalankan sampel dalam konfigurasi satu atau lintas komputer, ikuti instruksi pada Menjalankan Sampel WCF.