ServiceBehaviorAttribute.IncludeExceptionDetailInFaults Свойство
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Возвращает или задает значение, указывающее, что общие необработанные исключения выполнения должны преобразовываться в исключения FaultException<TDetail> типа ExceptionDetail и передаваться в виде сообщения об ошибке. Задавайте значение true
только во время разработки для устранения неполадок службы.
public:
property bool IncludeExceptionDetailInFaults { bool get(); void set(bool value); };
public bool IncludeExceptionDetailInFaults { get; set; }
member this.IncludeExceptionDetailInFaults : bool with get, set
Public Property IncludeExceptionDetailInFaults As Boolean
Значение свойства
true
, если необработанное исключение должно возвращаться в виде ошибок SOAP; в противном случае — false
. Значение по умолчанию — false
.
Примеры
В следующем примере кода показаны свойства 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>
Комментарии
Чтобы разрешить отправку информации об исключениях клиентам для целей отладки, для свойства IncludeExceptionDetailInFaults следует задать значение true
. Для этого свойства требуется привязка, поддерживающая либо обмен сообщениями типа «запрос-ответ», либо дуплексный обмен.
Во всех управляемых приложениях обработка ошибок представлена объектами Exception. В приложениях на основе SOAP, таких как приложения WCF, методы, реализующие операции службы, передают сведения об ошибке с помощью сообщений об ошибках SOAP. Так как приложения WCF выполняются в системах ошибок обоих типов, все управляемые сведения об исключениях, которые необходимо отправить клиенту, должны быть преобразованы из исключений в ошибки SOAP. Дополнительные сведения см. в разделе Указание и обработка ошибок в контрактах и службах.
Во время разработки может понадобиться, чтобы служба также отправляла клиенту другие исключения для упрощения отладки. Эта возможность предназначается только для этапа разработки, ее не следует использовать в рабочих версиях служб.
Чтобы упростить отладку разработки, задайте для параметра IncludeExceptionDetailInFaults значение true
в коде или с помощью файла конфигурации приложения.
Когда эта функция включена, служба автоматически возвращает вызывающему объекту информацию о более безопасных исключениях. Эти ошибки выглядят для клиента как объекты FaultException<TDetail> типа ExceptionDetail.
Важно!
Если задано значение IncludeExceptionDetailInFaults , true
клиенты могут получать сведения об исключениях метода внутренней службы. Это рекомендуется только в качестве способа временной отладки приложения службы. Кроме того, WSDL для метода, который возвращает такие необработанные управляемые исключения, не содержит контракт для исключения FaultException<TDetail> типа ExceptionDetail. В клиентах должна быть предусмотрена возможность принятия неизвестной ошибки SOAP для правильного получения отладочной информации.
Присвоить этому свойству значение true
можно также с помощью файла конфигурации приложения и <элемента serviceDebug> , как показано в следующем примере кода.
<serviceBehaviors>
<behavior name="metadataAndDebugEnabled">
<serviceDebug
includeExceptionDetailInFaults="true"
/>
<serviceMetadata
httpGetEnabled="true"
httpGetUrl=""
/>
</behavior>
</serviceBehaviors>