Nasıl yapılır: Hizmet Sözleşmelerinde Hata Bildirme

Yönetilen kodda hata koşulları oluştuğunda özel durumlar oluşur. Ancak Windows Communication Foundation (WCF) uygulamalarında hizmet sözleşmeleri, hizmet sözleşmesinde SOAP hataları bildirerek istemcilere hangi hata bilgilerinin döndürüleceğini belirtir. Özel durumlar ve hatalar arasındaki ilişkiye genel bakış için bkz . Sözleşmelerde ve Hizmetlerde Hataları Belirtme ve İşleme.

SOAP hatası belirten bir hizmet sözleşmesi oluşturma

  1. En az bir işlem içeren bir hizmet sözleşmesi oluşturun. Bir örnek için bkz . Nasıl yapılır: Hizmet Sözleşmesi Tanımlama.

  2. Hangi istemcilerin bildirim almayı bekleyebileceğiyle ilgili bir hata koşulu belirtebilen bir işlem seçin. İstemcilere SOAP hatalarının döndürülmesiyle ilgili hata koşullarını belirlemek için bkz . Sözleşmelerde ve Hizmetlerde Hataları Belirtme ve İşleme.

  3. Seçili işleme bir System.ServiceModel.FaultContractAttribute uygulayın ve oluşturucuya serileştirilebilir bir hata türü geçirin. Seri hale getirilebilir türler oluşturma ve kullanma hakkında ayrıntılı bilgi için bkz . Hizmet Sözleşmelerinde Veri AktarımıNı Belirtme. Aşağıdaki örnekte, işlemin bir GreetingFaultile sonuçlandığını belirtme SampleMethod işlemi gösterilmektedir.

    [OperationContract]
    [FaultContractAttribute(
      typeof(GreetingFault),
      Action="http://www.contoso.com/GreetingFault",
      ProtectionLevel=ProtectionLevel.EncryptAndSign
      )]
    string SampleMethod(string msg);
    
    <OperationContract, FaultContractAttribute(GetType(GreetingFault), Action:="http://www.contoso.com/GreetingFault", ProtectionLevel:=ProtectionLevel.EncryptAndSign)> _
    Function SampleMethod(ByVal msg As String) As String
    
  4. Sözleşmedeki istemcilere hata koşullarını bildiren tüm işlemler için 2. ve 3. adımları yineleyin.

Belirtilen SOAP Hatasını Döndürmek için İşlem Uygulama

Bir işlem, çağıran bir uygulamaya hata koşulu iletmek için belirli bir SOAP hatasının döndürülebileceğini (yukarıdaki yordamda olduğu gibi) belirttikten sonra, sonraki adım bu belirtimi uygulamaktır.

İşlemde belirtilen SOAP hatasını oluşturma

  1. Bir işlemde belirtilen bir FaultContractAttributehata koşulu oluştuğunda, belirtilen SOAP hatasının tür parametresi olduğu yeni System.ServiceModel.FaultException<TDetail> bir hata oluştur. Aşağıdaki örnekte, yukarıdaki yordamda SampleMethod ve aşağıdaki Kod bölümünde gösterilen içinde öğesinin nasıl atılması GreetingFault gösterilmektedir.

    throw new FaultException<GreetingFault>(new GreetingFault("A Greeting error occurred. You said: " + msg));
    
        Throw New FaultException(Of GreetingFault)(New GreetingFault("A Greeting error occurred. You said: " & msg))
    End If
    

Örnek

Aşağıdaki kod örneği, işlem için SampleMethod bir belirten GreetingFault tek bir işlemin uygulamasını gösterir.

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

Ayrıca bkz.