Bagikan melalui


FaultContractAttribute Kelas

Definisi

Menentukan satu atau beberapa kesalahan SOAP yang dikembalikan ketika operasi layanan mengalami kesalahan pemrosesan.

public ref class FaultContractAttribute sealed : Attribute
[System.AttributeUsage(System.AttributeTargets.Method, AllowMultiple=true, Inherited=false)]
public sealed class FaultContractAttribute : Attribute
[<System.AttributeUsage(System.AttributeTargets.Method, AllowMultiple=true, Inherited=false)>]
type FaultContractAttribute = class
    inherit Attribute
Public NotInheritable Class FaultContractAttribute
Inherits Attribute
Warisan
FaultContractAttribute
Atribut

Contoh

Contoh kode berikut menunjukkan penggunaan FaultContractAttribute untuk menentukan bahwa operasi SampleMethod dapat mengembalikan kesalahan SOAP dengan detail jenis GreetingFault.

using System;
using System.Collections.Generic;
using System.Net.Security;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;

namespace Microsoft.WCF.Documentation
{
  [ServiceContract(Namespace="http://microsoft.wcf.documentation")]
  public interface ISampleService{
    [OperationContract]
    [FaultContractAttribute(
      typeof(GreetingFault),
      Action="http://www.contoso.com/GreetingFault",
      ProtectionLevel=ProtectionLevel.EncryptAndSign
      )]
    string SampleMethod(string msg);
  }

  [DataContractAttribute]
  public class GreetingFault
  {
    private string report;

    public GreetingFault(string message)
    {
      this.report = message;
    }

    [DataMemberAttribute]
    public string Message
    {
      get { return this.report; }
      set { this.report = value; }
    }
  }

  class SampleService : ISampleService
  {
  #region ISampleService Members

  public string  SampleMethod(string msg)
  {
    Console.WriteLine("Client said: " + msg);
    // Generate intermittent error behavior.
    Random rnd = new Random(DateTime.Now.Millisecond);
    int test = rnd.Next(5);
    if (test % 2 != 0)
      return "The service greets you: " + msg;
    else
      throw new FaultException<GreetingFault>(new GreetingFault("A Greeting error occurred. You said: " + msg));
  }

  #endregion
  }
}

Imports System.Collections.Generic
Imports System.Net.Security
Imports System.Runtime.Serialization
Imports System.ServiceModel
Imports System.Text

Namespace Microsoft.WCF.Documentation
  <ServiceContract(Namespace:="http://microsoft.wcf.documentation")> _
  Public Interface ISampleService
    <OperationContract, FaultContractAttribute(GetType(GreetingFault), Action:="http://www.contoso.com/GreetingFault", ProtectionLevel:=ProtectionLevel.EncryptAndSign)> _
    Function SampleMethod(ByVal msg As String) As String
  End Interface

  <DataContractAttribute> _
  Public Class GreetingFault
    Private report As String

    Public Sub New(ByVal message As String)
      Me.report = message
    End Sub

    <DataMemberAttribute> _
    Public Property Message() As String
      Get
          Return Me.report
      End Get
      Set(ByVal value As String)
          Me.report = value
      End Set
    End Property
  End Class

  Friend Class SampleService
      Implements ISampleService
  #Region "ISampleService Members"

  Public Function SampleMethod(ByVal msg As String) As String Implements ISampleService.SampleMethod
    Console.WriteLine("Client said: " & msg)
    ' Generate intermittent error behavior.
    Dim rand As New Random(DateTime.Now.Millisecond)
    Dim test As Integer = rand.Next(5)
    If test Mod 2 <> 0 Then
      Return "The service greets you: " & msg
    Else
      Throw New FaultException(Of GreetingFault)(New GreetingFault("A Greeting error occurred. You said: " & msg))
    End If
  End Function

  #End Region
  End Class
End Namespace

Contoh kode berikut menunjukkan bahwa klien ISampleService WCF mengalami kesalahan SOAP ini sebagai FaultException<TDetail> jenis GreetingFault.

using System;
using System.ServiceModel;
using System.ServiceModel.Channels;
using Microsoft.WCF.Documentation;

public class Client
{
  public static void Main()
  {
    // Picks up configuration from the config file.
    SampleServiceClient wcfClient = new SampleServiceClient();
    try
    {
      // Making calls.
      Console.WriteLine("Enter the greeting to send: ");
      string greeting = Console.ReadLine();
      Console.WriteLine("The service responded: " + wcfClient.SampleMethod(greeting));

      Console.WriteLine("Press ENTER to exit:");
      Console.ReadLine();

      // Done with service.
      wcfClient.Close();
      Console.WriteLine("Done!");
    }
    catch (TimeoutException timeProblem)
    {
      Console.WriteLine("The service operation timed out. " + timeProblem.Message);
      Console.ReadLine();
      wcfClient.Abort();
    }
    catch (FaultException<GreetingFault> greetingFault)
    {
      Console.WriteLine(greetingFault.Detail.Message);
      Console.ReadLine();
      wcfClient.Abort();
    }
    catch (FaultException unknownFault)
    {
      Console.WriteLine("An unknown exception was received. " + unknownFault.Message);
      Console.ReadLine();
      wcfClient.Abort();
    }
    catch (CommunicationException commProblem)
    {
      Console.WriteLine("There was a communication problem. " + commProblem.Message + commProblem.StackTrace);
      Console.ReadLine();
      wcfClient.Abort();
    }
  }
}

Imports System.ServiceModel
Imports System.ServiceModel.Channels
Imports Microsoft.WCF.Documentation

Public Class Client
  Public Shared Sub Main()
    ' Picks up configuration from the config file.
    Dim wcfClient As New SampleServiceClient()
    Try
      ' Making calls.
      Console.WriteLine("Enter the greeting to send: ")
      Dim greeting As String = Console.ReadLine()
      Console.WriteLine("The service responded: " & wcfClient.SampleMethod(greeting))

      Console.WriteLine("Press ENTER to exit:")
      Console.ReadLine()

      ' Done with service. 
      wcfClient.Close()
      Console.WriteLine("Done!")
    Catch timeProblem As TimeoutException
      Console.WriteLine("The service operation timed out. " & timeProblem.Message)
      Console.ReadLine()
      wcfClient.Abort()
    Catch greetingFault As FaultException(Of GreetingFault)
      Console.WriteLine(greetingFault.Detail.Message)
      Console.ReadLine()
      wcfClient.Abort()
    Catch unknownFault As FaultException
      Console.WriteLine("An unknown exception was received. " & unknownFault.Message)
      Console.ReadLine()
      wcfClient.Abort()
    Catch commProblem As CommunicationException
      Console.WriteLine("There was a communication problem. " & commProblem.Message + commProblem.StackTrace)
      Console.ReadLine()
      wcfClient.Abort()
    End Try
  End Sub
End Class

Keterangan

Tandai operasi dengan FaultContractAttribute atribut untuk mendeklarasikan satu atau beberapa kondisi pengecualian spesifik yang ditambahkan ke deskripsi Web Service Description Language (WSDL) dari operasi layanan sebagai pesan kesalahan SOAP eksplisit yang dikembalikan oleh operasi.

Di semua aplikasi terkelola, kesalahan pemrosesan diwakili oleh Exception objek. Dalam aplikasi berbasis SOAP seperti aplikasi Windows Communication Foundation (WCF), metode layanan mengkomunikasikan pemrosesan informasi kesalahan menggunakan pesan kesalahan SOAP. Karena aplikasi WCF dijalankan di bawah kedua jenis sistem kesalahan, informasi pengecualian terkelola apa pun yang harus dikirim ke klien harus dikonversi dari pengecualian menjadi kesalahan SOAP. Anda dapat menggunakan perilaku pengecualian layanan default, atau Anda dapat secara eksplisit mengontrol apakah -- dan bagaimana -- pengecualian dipetakan ke pesan kesalahan. Untuk gambaran umum pengecualian dan kesalahan SOAP dalam aplikasi WCF, lihat Menentukan dan Menangani Kesalahan dalam Kontrak dan Layanan.

Disarankan agar operasi layanan menggunakan FaultContractAttribute untuk secara resmi menentukan semua kesalahan SOAP yang dapat diterima klien dalam operasi normal. Disarankan juga bahwa hanya informasi yang harus diketahui klien yang dikembalikan dalam kesalahan SOAP untuk meminimalkan pengungkapan informasi.

  • Properti Action mengontrol tindakan pesan kesalahan.

  • Properti DetailType mendapatkan jenis objek detail yang diserialisasikan dalam pesan kesalahan.

  • Properti Name dan Namespace mengontrol nama dan namespace, masing-masing, dari pesan kesalahan.

  • menunjukkan HasProtectionLevel apakah pesan kesalahan memiliki tingkat perlindungan yang ditentukan, dan jika demikian, properti mengontrol tingkat perlindungan tersebut ProtectionLevel .

Perhatian

Jika pesan kesalahan membawa informasi yang sensitif atau dapat menyebabkan masalah keamanan, sangat disarankan agar ProtectionLevel properti diatur.

Untuk banyak skenario ProtectionLevel pengaturan ke EncryptAndSign untuk pesan kesalahan sudah cukup. Untuk detail selengkapnya, lihat Memahami Tingkat Perlindungan.

Untuk mengembalikan kesalahan tertentu dari operasi yang ditandai dengan FaultContractAttribute, lemparkan FaultException<TDetail> (di mana parameter jenis adalah informasi kesalahan yang dapat diserialisasikan) ketika pengecualian terkelola terjadi selama operasi. Aplikasi klien WCF memunculkan kesalahan SOAP dengan jenis yang sama seperti yang dilemparkan dalam implementasi klien -- yaitu, sebagai FaultException<TDetail> (di mana typeparameter adalah informasi kesalahan yang dapat diserialisasikan). FaultContractAttribute dapat digunakan hanya untuk menentukan kesalahan SOAP untuk operasi layanan dua arah dan untuk pasangan operasi asinkron; operasi satu arah tidak mendukung kesalahan SOAP dan oleh karena itu tidak mendukung FaultContractAttribute.

Nota

Anda dapat menggunakan jenis yang dapat diserialisasikan untuk menyampaikan informasi kesalahan. Satu-satunya batasan dalam versi WCF ini adalah jenis yang ditentukan dalam harus dapat diserialisasikan FaultContractAttribute oleh System.Runtime.Serialization.DataContractSerializer. Untuk dukungan serialisasi yang DataContractSerializer disediakan, lihat Serializer Kontrak Data.

Misalnya, untuk menentukan bahwa klien dapat mengharapkan kesalahan SOAP yang berisi Int32, tempatkan parameter jenis tersebut FaultContractAttribute dalam pada metode layanan Anda.

Nota

Contoh kode berikut tidak mengatur ProtectionLevelproperti , , Nameatau Namespace .

[OperationContractAttribute]
[FaultContractAttribute(typeof(int))]
int Divide(int arg1, int arg2);
  <OperationContractAttribute(), FaultContractAttribute(GetType(Integer))> _
    Function Divide(ByVal arg1 As Integer, ByVal arg2 As Integer) As Integer
End Interface 'FCADemonstration

Kemudian, dalam metode layanan Anda, lemparkan yang baru FaultException<TDetail> di mana parameter jenis adalah jenis yang berisi informasi kesalahan (dalam kasus di atas, a Int32). Contohnya:

throw new FaultException<int>(4);
Throw New FaultException(Of Integer)(4)

Contoh sebelumnya sangat mendasar; hampir semua informasi dapat diteruskan menggunakan System.Int32 kode, sehingga jenis detail ini bukan yang paling berguna. Biasanya, aplikasi WCF menentukan kesalahan SOAP dengan jenis detail khusus untuk persyaratan informasi kesalahan klien. Untuk contoh yang lebih lengkap, lihat bagian Contoh.

Nota

Jika Anda menentukan FaultException<TDetail> di mana parameter jenis adalah System.String, nilai string ditetapkan ke properti Detail di aplikasi klien; klien tidak dapat mengambil string tersebut FaultException<TDetail>.ToString dengan memanggil metode . Agar nilai string dikembalikan saat aplikasi klien memanggil Exception.ToString, berikan System.ServiceModel.FaultException pengecualian di dalam operasi dan teruskan string ke konstruktor.

Untuk secara eksplisit mengontrol perilaku aplikasi saat pengecualian atau FaultException<TDetail> dilemparkan, terapkan System.ServiceModel.Dispatcher.IErrorHandler antarmuka pada System.ServiceModel.Description.IServiceBehavior, System.ServiceModel.Description.IContractBehavior atau System.ServiceModel.Description.IEndpointBehavior dan tetapkan ke ChannelDispatcher.ErrorHandlers properti . IErrorHandler memungkinkan Anda untuk secara eksplisit mengontrol kesalahan SOAP yang dihasilkan dan apakah akan mengirimkannya kembali ke klien.

Untuk memfasilitasi penelusuran kesalahan, atur ServiceBehaviorAttribute.IncludeExceptionDetailInFaults ke true dalam kode atau Anda dapat menggunakan ServiceDebugBehavior.IncludeExceptionDetailInFaults dalam file konfigurasi aplikasi. Saat diaktifkan, layanan secara otomatis mengembalikan informasi pengecualian ke pemanggil. Kesalahan ini muncul kepada klien sebagai FaultException pengecualian.

Penting

Karena pengecualian terkelola dapat mengekspos informasi aplikasi internal, pengaturan ServiceBehaviorAttribute.IncludeExceptionDetailInFaults atau ServiceDebugBehavior.IncludeExceptionDetailInFaults untuk true dapat mengizinkan klien WCF untuk mendapatkan informasi tentang pengecualian operasi layanan internal, termasuk informasi yang dapat diidentifikasi secara pribadi atau sensitif lainnya.

Oleh karena itu, pengaturan ServiceBehaviorAttribute.IncludeExceptionDetailInFaults atau ServiceDebugBehavior.IncludeExceptionDetailInFaults ke true hanya disarankan sebagai cara untuk men-debug sementara aplikasi layanan. Selain itu, WSDL untuk suatu metode yang mengembalikan pengecualian terkelola yang tidak tertangani dengan cara ini tidak mencakup kontrak untuk FaultException<TDetail> dari tipe String. Klien harus bersiap menghadapi kemungkinan kesalahan SOAP yang tidak diketahui (dikembalikan ke klien WCF sebagai objek System.ServiceModel.FaultException) untuk mendapatkan informasi debugging dengan benar.

Konstruktor

Nama Deskripsi
FaultContractAttribute(Type)

Menginisialisasi instans baru dari kelas FaultContractAttribute.

Properti

Nama Deskripsi
Action

Mendapatkan atau menetapkan tindakan pesan kesalahan SOAP yang ditentukan sebagai bagian dari kontrak operasi.

DetailType

Memperoleh tipe dari objek yang dapat diserialisasikan dan berisi informasi kesalahan.

HasProtectionLevel

Mendapatkan nilai yang menunjukkan apakah pesan kesalahan SOAP memiliki tingkat perlindungan yang ditetapkan.

Name

Mendapatkan atau mengatur nama pesan kesalahan dalam Bahasa Deskripsi Layanan Web (WSDL).

Namespace

Mendapatkan atau mengatur namespace layanan kesalahan SOAP.

ProtectionLevel

Menentukan tingkat perlindungan yang diperlukan kesalahan SOAP dari pengikatan.

TypeId

Ketika diimplementasikan dalam kelas turunan, mendapatkan pengidentifikasi unik untuk Attributeini.

(Diperoleh dari Attribute)

Metode

Nama Deskripsi
Equals(Object)

Mengembalikan nilai yang menunjukkan apakah instans ini sama dengan objek tertentu.

(Diperoleh dari Attribute)
GetHashCode()

Mengembalikan kode hash untuk instans ini.

(Diperoleh dari Attribute)
GetType()

Mendapatkan Type instans saat ini.

(Diperoleh dari Object)
IsDefaultAttribute()

Ketika ditimpa dalam kelas turunan, menunjukkan apakah nilai instans ini adalah nilai default untuk kelas turunan.

(Diperoleh dari Attribute)
Match(Object)

Saat ditimpa dalam kelas turunan, mengembalikan nilai yang menunjukkan apakah instans ini sama dengan objek tertentu.

(Diperoleh dari Attribute)
MemberwiseClone()

Membuat salinan dangkal dari Objectsaat ini.

(Diperoleh dari Object)
ToString()

Mengembalikan string yang mewakili objek saat ini.

(Diperoleh dari Object)

Implementasi Antarmuka Eksplisit

Nama Deskripsi
_Attribute.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr)

Memetakan sekumpulan nama ke sekumpulan pengidentifikasi pengiriman yang sesuai.

(Diperoleh dari Attribute)
_Attribute.GetTypeInfo(UInt32, UInt32, IntPtr)

Mengambil informasi jenis untuk objek, yang dapat digunakan untuk mendapatkan informasi jenis untuk antarmuka.

(Diperoleh dari Attribute)
_Attribute.GetTypeInfoCount(UInt32)

Mengambil jumlah antarmuka informasi jenis yang disediakan objek (baik 0 atau 1).

(Diperoleh dari Attribute)
_Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr)

Menyediakan akses ke properti dan metode yang diekspos oleh objek.

(Diperoleh dari Attribute)

Berlaku untuk