IServiceBehavior Antarmuka
Definisi
Penting
Beberapa informasi terkait produk prarilis yang dapat diubah secara signifikan sebelum dirilis. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
Menyediakan mekanisme untuk memodifikasi atau menyisipkan ekstensi kustom di seluruh layanan, termasuk ServiceHostBase.
public interface class IServiceBehavior
public interface IServiceBehavior
type IServiceBehavior = interface
Public Interface IServiceBehavior
- Turunan
Contoh
Contoh kode berikut menunjukkan penggunaan perilaku layanan yang ditentukan dalam file konfigurasi untuk menyisipkan penangan kesalahan kustom dalam aplikasi layanan. Dalam contoh ini, handler kesalahan menangkap semua pengecualian dan mengonversinya menjadi kesalahan SOAP kustom GreetingFault yang kemudian dikembalikan ke klien.
Implementasi berikut IServiceBehavior tidak menambahkan objek parameter pengikatan, menambahkan objek kustom System.ServiceModel.Dispatcher.IErrorHandler ke setiap ChannelDispatcher.ErrorHandlers properti, dan memvalidasi bahwa setiap operasi layanan tempat perilaku layanan diterapkan dan memiliki System.ServiceModel.FaultContractAttribute jenis GreetingFault.
// This behavior modifies no binding parameters.
#region IServiceBehavior Members
public void AddBindingParameters(
ServiceDescription description,
ServiceHostBase serviceHostBase,
System.Collections.ObjectModel.Collection<ServiceEndpoint> endpoints,
System.ServiceModel.Channels.BindingParameterCollection parameters
)
{
return;
}
// This behavior is an IErrorHandler implementation and
// must be applied to each ChannelDispatcher.
public void ApplyDispatchBehavior(ServiceDescription description, ServiceHostBase serviceHostBase)
{
Console.WriteLine("The EnforceGreetingFaultBehavior has been applied.");
foreach(ChannelDispatcher chanDisp in serviceHostBase.ChannelDispatchers)
{
chanDisp.ErrorHandlers.Add(this);
}
}
// This behavior requires that the contract have a SOAP fault with a detail type of GreetingFault.
public void Validate(ServiceDescription description, ServiceHostBase serviceHostBase)
{
Console.WriteLine("Validate is called.");
foreach (ServiceEndpoint se in description.Endpoints)
{
// Must not examine any metadata endpoint.
if (se.Contract.Name.Equals("IMetadataExchange")
&& se.Contract.Namespace.Equals("http://schemas.microsoft.com/2006/04/mex"))
continue;
foreach (OperationDescription opDesc in se.Contract.Operations)
{
if (opDesc.Faults.Count == 0)
throw new InvalidOperationException(String.Format(
"EnforceGreetingFaultBehavior requires a "
+ "FaultContractAttribute(typeof(GreetingFault)) in each operation contract. "
+ "The \"{0}\" operation contains no FaultContractAttribute.",
opDesc.Name)
);
bool gfExists = false;
foreach (FaultDescription fault in opDesc.Faults)
{
if (fault.DetailType.Equals(typeof(GreetingFault)))
{
gfExists = true;
continue;
}
}
if (!gfExists)
{
throw new InvalidOperationException(
"EnforceGreetingFaultBehavior requires a FaultContractAttribute(typeof(GreetingFault)) in an operation contract."
);
}
}
}
}
#endregion
' This behavior modifies no binding parameters.
#Region "IServiceBehavior Members"
Public Sub AddBindingParameters(ByVal description As ServiceDescription, ByVal serviceHostBase As ServiceHostBase, ByVal endpoints As System.Collections.ObjectModel.Collection(Of ServiceEndpoint), ByVal parameters As System.ServiceModel.Channels.BindingParameterCollection) Implements IServiceBehavior.AddBindingParameters
Return
End Sub
' This behavior is an IErrorHandler implementation and
' must be applied to each ChannelDispatcher.
Public Sub ApplyDispatchBehavior(ByVal description As ServiceDescription, ByVal serviceHostBase As ServiceHostBase) Implements IServiceBehavior.ApplyDispatchBehavior
Console.WriteLine("The EnforceGreetingFaultBehavior has been applied.")
For Each chanDisp As ChannelDispatcher In serviceHostBase.ChannelDispatchers
chanDisp.ErrorHandlers.Add(Me)
Next chanDisp
End Sub
' This behavior requires that the contract have a SOAP fault with a detail type of GreetingFault.
Public Sub Validate(ByVal description As ServiceDescription, ByVal serviceHostBase As ServiceHostBase) Implements IServiceBehavior.Validate
Console.WriteLine("Validate is called.")
For Each se As ServiceEndpoint In description.Endpoints
' Must not examine any metadata endpoint.
If se.Contract.Name.Equals("IMetadataExchange") AndAlso se.Contract.Namespace.Equals("http://schemas.microsoft.com/2006/04/mex") Then
Continue For
End If
For Each opDesc As OperationDescription In se.Contract.Operations
If opDesc.Faults.Count = 0 Then
Throw New InvalidOperationException(String.Format("EnforceGreetingFaultBehavior requires a " & "FaultContractAttribute(typeof(GreetingFault)) in each operation contract. " & "The ""{0}"" operation contains no FaultContractAttribute.", opDesc.Name))
End If
Dim gfExists As Boolean = False
For Each fault As FaultDescription In opDesc.Faults
If fault.DetailType.Equals(GetType(GreetingFault)) Then
gfExists = True
Continue For
End If
Next fault
If gfExists = False Then
Throw New InvalidOperationException("EnforceGreetingFaultBehavior requires a FaultContractAttribute(typeof(GreetingFault)) in an operation contract.")
End If
Next opDesc
Next se
End Sub
#End Region
Dalam contoh ini, kelas perilaku juga menerapkan System.ServiceModel.Configuration.BehaviorExtensionElement, yang memungkinkan perilaku layanan dimasukkan dengan menggunakannya dalam file konfigurasi aplikasi, seperti yang ditunjukkan contoh kode berikut.
<configuration>
<system.serviceModel>
<services>
<service
name="Microsoft.WCF.Documentation.SampleService"
behaviorConfiguration="metaAndErrors">
<host>
<baseAddresses>
<add baseAddress="http://localhost:8080/SampleService"/>
</baseAddresses>
</host>
<endpoint
address=""
binding="wsHttpBinding"
contract="Microsoft.WCF.Documentation.ISampleService"
/>
<endpoint
address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange"
/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="metaAndErrors">
<serviceDebug includeExceptionDetailInFaults="true"/>
<serviceMetadata httpGetEnabled="true"/>
<enforceGreetingFaults />
</behavior>
</serviceBehaviors>
</behaviors>
<extensions>
<behaviorExtensions>
<add
name="enforceGreetingFaults"
type="Microsoft.WCF.Documentation.EnforceGreetingFaultBehavior, HostApplication, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"
/>
</behaviorExtensions>
</extensions>
</system.serviceModel>
</configuration>
Keterangan
Terapkan IServiceBehavior untuk memodifikasi, memeriksa, atau memperluas beberapa aspek eksekusi di seluruh layanan di tingkat aplikasi:
ApplyDispatchBehavior Gunakan metode untuk mengubah nilai properti run-time atau menyisipkan objek ekstensi kustom seperti penangan kesalahan, pencegat pesan atau parameter, ekstensi keamanan, dan objek ekstensi kustom lainnya.
Validate Gunakan metode untuk memeriksa deskripsi sebelum Windows Communication Foundation (WCF) membangun layanan yang dijalankan untuk mengonfirmasi bahwa itu dapat dijalankan dengan benar.
AddBindingParameters Gunakan metode untuk meneruskan ke elemen pengikatan informasi kustom untuk layanan sehingga dapat mendukung layanan dengan benar.
IServiceBehavior objek dapat menggunakan salah satu metode ini, tetapi seringkali hanya satu yang penting; dalam kasus seperti itu, metode yang tidak digunakan dapat kembali tanpa nilai.
Nota
Semua metode meneruskan IServiceBehaviorSystem.ServiceModel.Description.ServiceDescription dan System.ServiceModel.ServiceHostBase objek sebagai parameter. Parameter ServiceDescription hanya untuk pemeriksaan; jika Anda memodifikasi objek ini, perilaku eksekusi tidak ditentukan.
Untuk melakukan tugas penyesuaian yang dimaksudkannya, IServiceBehavior objek harus ditambahkan ke Behaviors properti sebelum konstruksi runtime layanan. Ada tiga cara untuk melakukan ini:
Tambahkan perilaku layanan kustom secara terprogram ke Behaviors properti sebelum titik di mana ICommunicationObject.Open metode dipanggil pada System.ServiceModel.ServiceHost objek.
Buat atribut kustom yang mengimplementasikan IServiceBehavior dan menggunakannya untuk menandai kelas layanan yang akan dimodifikasi. ServiceHost Saat objek dibangun, WCF menggunakan pantulan untuk menemukan atribut pada jenis layanan. Jika ada atribut yang mengimplementasikan IServiceBehavior, atribut ditambahkan ke koleksi perilaku di ServiceDescription.
System.ServiceModel.Configuration.BehaviorExtensionElement Perluas kelas untuk mendukung spesifikasi perilaku dalam file konfigurasi aplikasi atau mesin. Lihat bagian Contoh untuk informasi selengkapnya.
Contoh perilaku layanan di WCF termasuk ServiceBehaviorAttribute atribut, System.ServiceModel.Description.ServiceThrottlingBehavior, dan System.ServiceModel.Description.ServiceDebugBehaviorSystem.ServiceModel.Description.ServiceMetadataBehavior perilaku.
Metode
| Nama | Deskripsi |
|---|---|
| AddBindingParameters(ServiceDescription, ServiceHostBase, Collection<ServiceEndpoint>, BindingParameterCollection) |
Menyediakan kemampuan untuk meneruskan data kustom ke elemen pengikatan untuk mendukung implementasi kontrak. |
| ApplyDispatchBehavior(ServiceDescription, ServiceHostBase) |
Menyediakan kemampuan untuk mengubah nilai properti run-time atau menyisipkan objek ekstensi kustom seperti penangan kesalahan, pencegat pesan atau parameter, ekstensi keamanan, dan objek ekstensi kustom lainnya. |
| Validate(ServiceDescription, ServiceHostBase) |
Menyediakan kemampuan untuk memeriksa host layanan dan deskripsi layanan untuk mengonfirmasi bahwa layanan dapat berjalan dengan sukses. |