ServiceBehaviorAttribute 类

定义

指定服务协定实现的内部执行行为。

public ref class ServiceBehaviorAttribute sealed : Attribute, System::ServiceModel::Description::IServiceBehavior
[System.AttributeUsage(System.AttributeTargets.Class)]
public sealed class ServiceBehaviorAttribute : Attribute, System.ServiceModel.Description.IServiceBehavior
[<System.AttributeUsage(System.AttributeTargets.Class)>]
type ServiceBehaviorAttribute = class
    inherit Attribute
    interface IServiceBehavior
Public NotInheritable Class ServiceBehaviorAttribute
Inherits Attribute
Implements IServiceBehavior
继承
ServiceBehaviorAttribute
属性
实现

示例

下面的代码示例演示了 ServiceBehaviorAttribute 属性。 BehaviorService 类使用 ServiceBehaviorAttribute 属性以指示:

  • 事务完成后,回收服务对象。

  • 每个会话都有一个服务对象。

  • 服务是单线程服务,不支持可重入调用。

而且,在操作级别,OperationBehaviorAttribute 值指示 TxWork 方法将自动登记到流事务中或创建新事务来做这项工作,并指示如果没有发生未经处理的异常,则自动提交此事务。

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

为了正确执行下面的代码示例,基础绑定必须支持流事务。 例如,若要使用 WSHttpBinding 支持流事务,请在代码或应用程序配置文件中将 TransactionFlow 属性设置为 true。 下面的代码示例演示上述示例的配置文件。

<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>

注解

ServiceBehaviorAttribute 属性应用于服务实现,以指定服务范围的执行行为。 (若要在方法级别指定执行行为,请使用 OperationBehaviorAttribute attribute。) 此属性只能应用于服务实现。 有关工作示例,请参阅 服务:行为示例

ServiceBehaviorAttribute 属性是 Windows Communication Foundation (WCF) 编程模型功能,可实现开发人员必须实现的常见功能。 有关这些行为和其他行为的详细信息,请参阅 指定服务 Run-Time 行为。 有关以下某些属性设置的基础运行时属性的详细信息,请参阅 扩展 ServiceHost 和服务模型层

IncludeExceptionDetailInFaults 属性也可以使用应用程序配置文件进行设置。 有关详细信息,请参阅 IncludeExceptionDetailInFaults

构造函数

ServiceBehaviorAttribute()

初始化 ServiceBehaviorAttribute 类的新实例。

属性

AddressFilterMode

获取或设置调度程序用于将传入消息路由到正确终结点的 AddressFilterMode

AutomaticSessionShutdown

指定在客户端关闭输出会话时是否自动关闭会话。

ConcurrencyMode

获取或设置一个值,该值指示服务是支持单线程、多线程还是支持可重入调用。

ConfigurationName

获取或设置用于在应用程序配置文件中定位服务元素的值。

EnsureOrderedDispatch

获取或设置指示是否确保服务有序调度的值。

IgnoreExtensionDataObject

获取或设置一个值,该值指定是否将未知序列化数据发送到网络上。

IncludeExceptionDetailInFaults

获取或设置一个值,该值指定是否要将常规未处理执行异常转换为 FaultException<TDetail> 类型的 ExceptionDetail 并将其作为错误消息发送。 仅在开发阶段将其设置为 true 以便对服务进行故障排除。

InstanceContextMode

获取或设置指示新服务对象何时创建的值。

MaxItemsInObjectGraph

获取或设置序列化对象中允许的最大项数。

Name

获取或设置 Web 服务描述语言 (WSDL) 中服务元素中的名称属性值。

Namespace

获取或设置 Web 服务描述语言 (WSDL) 中服务的目标命名空间值。

ReleaseServiceInstanceOnTransactionComplete

获取或设置一个值,该值指定在完成当前事务后是否释放服务对象。

TransactionAutoCompleteOnSessionClose

获取或设置一个值,该值指定当前会话正常关闭时是否完成挂起事务。

TransactionIsolationLevel

指定服务中新创建的事务和客户端传入的流事务的事务隔离级别。

TransactionTimeout

获取或设置事务必须在此期间完成的时间段。

TypeId

在派生类中实现时,获取此 Attribute 的唯一标识符。

(继承自 Attribute)
UseSynchronizationContext

获取或设置一个值,该值指定是否使用当前同步上下文来选择执行的线程。

ValidateMustUnderstand

获取或设置一个值,该值指定是由系统还是由应用程序强制执行 SOAP MustUnderstand 标头处理。

方法

Equals(Object)

返回一个值,该值指示此实例是否与指定的对象相等。

(继承自 Attribute)
GetHashCode()

返回此实例的哈希代码。

(继承自 Attribute)
GetType()

获取当前实例的 Type

(继承自 Object)
GetWellKnownSingleton()

检索实现此服务的对象,该对象被用作服务的单一实例;如果没有单一实例,则为 null

IsDefaultAttribute()

在派生类中重写时,指示此实例的值是否是派生类的默认值。

(继承自 Attribute)
Match(Object)

当在派生类中重写时,返回一个指示此实例是否等于指定对象的值。

(继承自 Attribute)
MemberwiseClone()

创建当前 Object 的浅表副本。

(继承自 Object)
SetWellKnownSingleton(Object)

指定实现此服务的对象,该对象被用作服务的单一实例。

ShouldSerializeConfigurationName()

返回一个值,该值指示 ConfigurationName 属性是否已更改,不再是默认值且应对其进行序列化。

ShouldSerializeReleaseServiceInstanceOnTransactionComplete()

返回一个值,该值指示 ReleaseServiceInstanceOnTransactionComplete 属性是否已更改,不再是默认值且应对其进行序列化。

ShouldSerializeTransactionAutoCompleteOnSessionClose()

返回一个值,该值指示 TransactionAutoCompleteOnSessionClose 属性是否已更改,不再是默认值且应对其进行序列化。

ShouldSerializeTransactionIsolationLevel()

返回一个值,该值指示 TransactionIsolationLevel 属性是否已更改,不再是默认值且应对其进行序列化。

ShouldSerializeTransactionTimeout()

返回一个值,该值指示 TransactionTimeout 属性是否已更改,不再是默认值且应对其进行序列化。

ToString()

返回表示当前对象的字符串。

(继承自 Object)

显式接口实现

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

将一组名称映射为对应的一组调度标识符。

(继承自 Attribute)
_Attribute.GetTypeInfo(UInt32, UInt32, IntPtr)

检索对象的类型信息,然后可以使用该信息获取接口的类型信息。

(继承自 Attribute)
_Attribute.GetTypeInfoCount(UInt32)

检索对象提供的类型信息接口的数量(0 或 1)。

(继承自 Attribute)
_Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr)

提供对某一对象公开的属性和方法的访问。

(继承自 Attribute)
IServiceBehavior.AddBindingParameters(ServiceDescription, ServiceHostBase, Collection<ServiceEndpoint>, BindingParameterCollection)

将自定义数据对象传递到支持此行为属性的绑定。

IServiceBehavior.ApplyDispatchBehavior(ServiceDescription, ServiceHostBase)

自定义服务运行时,以支持行为属性。

IServiceBehavior.Validate(ServiceDescription, ServiceHostBase)

确认服务说明和服务主机是否支持此行为。

适用于

另请参阅