ServiceBehaviorAttribute.InstanceContextMode Properti
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.
Mendapatkan atau mengatur nilai yang menunjukkan kapan objek layanan baru dibuat.
public:
property System::ServiceModel::InstanceContextMode InstanceContextMode { System::ServiceModel::InstanceContextMode get(); void set(System::ServiceModel::InstanceContextMode value); };
public System.ServiceModel.InstanceContextMode InstanceContextMode { get; set; }
member this.InstanceContextMode : System.ServiceModel.InstanceContextMode with get, set
Public Property InstanceContextMode As InstanceContextMode
Nilai Properti
Salah InstanceContextMode satu nilai; nilai defaultnya adalah PerSession.
Pengecualian
Nilai bukan salah InstanceContextMode satu nilai.
Contoh
Contoh kode berikut menunjukkan ServiceBehaviorAttribute properti . Kelas BehaviorService
menggunakan ServiceBehaviorAttribute atribut untuk menunjukkan bahwa:
Metode implementasi dipanggil pada utas UI.
Ada satu objek layanan untuk setiap sesi.
Layanan ini berutas tunggal dan tidak mendukung panggilan masuk kembali.
Selain itu, pada tingkat operasi, OperationBehaviorAttribute nilai menunjukkan bahwa TxWork
metode secara otomatis mendaftar dalam transaksi yang dialirkan atau membuat transaksi baru untuk melakukan pekerjaan, dan bahwa transaksi dilakukan secara otomatis jika pengecualian yang tidak tertangani tidak terjadi.
using System;
using System.ServiceModel;
using System.Transactions;
namespace Microsoft.WCF.Documentation
{
[ServiceContract(
Namespace="http://microsoft.wcf.documentation",
SessionMode=SessionMode.Required
)]
public interface IBehaviorService
{
[OperationContract]
string TxWork(string message);
}
// Note: To use the TransactionIsolationLevel property, you
// must add a reference to the System.Transactions.dll assembly.
/* The following service implementation:
* -- Processes messages on one thread at a time
* -- Creates one service object per session
* -- Releases the service object when the transaction commits
*/
[ServiceBehavior(
ConcurrencyMode=ConcurrencyMode.Single,
InstanceContextMode=InstanceContextMode.PerSession,
ReleaseServiceInstanceOnTransactionComplete=true
)]
public class BehaviorService : IBehaviorService, IDisposable
{
Guid myID;
public BehaviorService()
{
myID = Guid.NewGuid();
Console.WriteLine(
"Object "
+ myID.ToString()
+ " created.");
}
/*
* The following operation-level behaviors are specified:
* -- The executing transaction is committed when
* the operation completes without an
* unhandled exception
* -- Always executes under a flowed transaction.
*/
[OperationBehavior(
TransactionAutoComplete = true,
TransactionScopeRequired = true
)]
[TransactionFlow(TransactionFlowOption.Mandatory)]
public string TxWork(string message)
{
// Do some transactable work.
Console.WriteLine("TxWork called with: " + message);
// Display transaction information.
TransactionInformation info = Transaction.Current.TransactionInformation;
Console.WriteLine("The distributed tx ID: {0}.", info.DistributedIdentifier);
Console.WriteLine("The tx status: {0}.", info.Status);
return String.Format("Hello. This was object {0}.",myID.ToString()) ;
}
public void Dispose()
{
Console.WriteLine(
"Service "
+ myID.ToString()
+ " is being recycled."
);
}
}
}
Imports System.ServiceModel
Imports System.Transactions
Namespace Microsoft.WCF.Documentation
<ServiceContract(Namespace:="http://microsoft.wcf.documentation", SessionMode:=SessionMode.Required)> _
Public Interface IBehaviorService
<OperationContract> _
Function TxWork(ByVal message As String) As String
End Interface
' Note: To use the TransactionIsolationLevel property, you
' must add a reference to the System.Transactions.dll assembly.
' The following service implementation:
' * -- Processes messages on one thread at a time
' * -- Creates one service object per session
' * -- Releases the service object when the transaction commits
'
<ServiceBehavior(ConcurrencyMode:=ConcurrencyMode.Single, InstanceContextMode:=InstanceContextMode.PerSession, _
ReleaseServiceInstanceOnTransactionComplete:=True)> _
Public Class BehaviorService
Implements IBehaviorService, IDisposable
Private myID As Guid
Public Sub New()
myID = Guid.NewGuid()
Console.WriteLine("Object " & myID.ToString() & " created.")
End Sub
'
' * The following operation-level behaviors are specified:
' * -- The executing transaction is committed when
' * the operation completes without an
' * unhandled exception
' * -- Always executes under a flowed transaction.
'
<OperationBehavior(TransactionAutoComplete:=True, TransactionScopeRequired:=True), TransactionFlow(TransactionFlowOption.Mandatory)> _
Public Function TxWork(ByVal message As String) As String Implements IBehaviorService.TxWork
' Do some transactable work.
Console.WriteLine("TxWork called with: " & message)
' Display transaction information.
Dim info As TransactionInformation = Transaction.Current.TransactionInformation
Console.WriteLine("The distributed tx ID: {0}.", info.DistributedIdentifier)
Console.WriteLine("The tx status: {0}.", info.Status)
Return String.Format("Hello. This was object {0}.", myID.ToString())
End Function
Public Sub Dispose() Implements IDisposable.Dispose
Console.WriteLine("Service " & myID.ToString() & " is being recycled.")
End Sub
End Class
End Namespace
Pengikatan yang mendasar harus mendukung transaksi yang mengalir agar contoh kode berikut dapat dijalankan dengan benar. Untuk mendukung transaksi yang mengalir menggunakan WSHttpBinding, misalnya, atur TransactionFlow properti ke true
dalam kode atau dalam file konfigurasi aplikasi. Contoh kode berikut menunjukkan file konfigurasi untuk sampel sebelumnya.
<configuration>
<system.serviceModel>
<services>
<service
name="Microsoft.WCF.Documentation.BehaviorService"
behaviorConfiguration="metadataAndDebugEnabled"
>
<host>
<baseAddresses>
<add baseAddress="http://localhost:8080/SampleService"/>
</baseAddresses>
</host>
<!--
Note:
This example code uses the WSHttpBinding to support transactions using the
WS-AtomicTransactions (WS-AT) protocol. WSHttpBinding is configured to use the
protocol, but the protocol is not enabled on some computers. Use the xws_reg -wsat+
command to enable the WS-AtomicTransactions protocol in the MSDTC service.
-->
<endpoint
contract="Microsoft.WCF.Documentation.IBehaviorService"
binding="wsHttpBinding"
bindingConfiguration="wsHttpBindingWithTXFlow"
address="http://localhost:8080/BehaviorService"
/>
<endpoint
contract="Microsoft.WCF.Documentation.IBehaviorService"
binding="netTcpBinding"
bindingConfiguration="netTcpBindingWithTXFlow"
address="net.tcp://localhost:8081/BehaviorService"
/>
<endpoint
address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange"
/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="metadataAndDebugEnabled">
<serviceDebug
includeExceptionDetailInFaults="true"
/>
<serviceMetadata
httpGetEnabled="true"
httpGetUrl=""
/>
</behavior>
</serviceBehaviors>
</behaviors>
<!-- binding configuration - configures a WSHttpBinding to require transaction flow -->
<bindings>
<wsHttpBinding>
<binding name="wsHttpBindingWithTXFlow" transactionFlow="true" />
</wsHttpBinding>
<netTcpBinding>
<binding name="netTcpBindingWithTXFlow" transactionFlow="true" />
</netTcpBinding>
</bindings>
</system.serviceModel>
</configuration>
Keterangan
InstanceContextMode Gunakan properti untuk menentukan kapan objek layanan baru dibuat. Karena objek layanan tidak terhubung langsung ke saluran komunikasi, masa pakai objek layanan tidak bergantung pada masa pakai saluran antara klien dan aplikasi layanan. Nilai default, PerSession, menginstruksikan aplikasi layanan untuk membuat objek layanan baru ketika sesi komunikasi baru dibuat antara klien dan aplikasi layanan. Panggilan berikutnya dalam sesi yang sama ditangani oleh objek yang sama.
PerSession menunjukkan bahwa setiap objek layanan menangani permintaan dari satu saluran klien.
Catatan
Properti InstanceContextMode berinteraksi dengan beberapa pengaturan lain. Misalnya, jika InstanceContextMode nilai diatur ke Single hasilnya adalah layanan Anda hanya dapat memproses satu pesan pada satu waktu kecuali Anda juga mengatur nilai ke ConcurrencyModeMultiple. Properti ini juga menghasilkan perilaku dalam kombinasi dengan ServiceContractAttribute.SessionMode properti . Untuk detailnya, lihat Sesi, Instancing, dan Konkurensi.
Untuk perilaku seumur hidup singleton (misalnya, jika aplikasi host memanggil ServiceHost konstruktor dan meneruskan objek untuk digunakan sebagai layanan), kelas layanan harus diatur InstanceContextMode ke Single
, atau pengecualian dilemparkan pada durasi.