標準の .Net 例外は、サーバー側で正しくシリアル化され、クライアント側で逆シリアル化されます。デフォルトでは、私たちのものではありません。なんで ?デバッグ セッション中にビジネス例外をクライアントに送信することがベスト プラクティスである場合が
あります
。
ExceptionFault<ExceptionDetail>
ただし、コードを本番環境に置くときは、例外を送信しないように注意してください。サービスがインターネット上に公開されている場合、ハッカーに詳細を開示するセキュリティ リークが発生する可能性があります。
ビジネス例外をクライアントに送信するためのベスト (およびいくつかの必須) プラクティスは次のとおりです。
serviceDebugBehavior
1/をオンに切り替えます
ServiceHost host = ...;
var debuggingBehavior = host.Description.Behaviors.Find<ServiceBehaviorAttribute>();
if (debuggingBehavior == null)
debuggingBehavior = new ServiceBehaviorAttribute();
#if DEBUG
debuggingBehavior.IncludeExceptionDetailInFaults = true;
#else
debuggingBehavior.IncludeExceptionDetailInFaults = false;
#endif
xmlで構成するのも非常に簡単です
2/ サービス インターフェイスで、いくつかの [FaultContract] を宣言します。
[ServiceContract(Namespace="your namespace")]
public interface IBillingService
{
[OperationContract]
[FaultContract(typeof(BusinessException))]
void RaiseBusinessException();
}
3/ ビジネス例外はシリアライズ可能としてマークする必要があります
[Serializable]
public class BusinessException : Exception
{ ... }
4/ クライアント側でビジネス例外を正しく逆シリアル化するには、FaultException<BusinessException>
逆シリアル化を処理するコンストラクターを実装することが重要です。それ以外の場合は、ジェネリックが取得されますFaultException
。
protected BusinessException(SerializationInfo info, StreamingContext context)
: base(info, context)
{}
5/例外に余分なメンバーがある場合は、それらをシリアル化/逆シリアル化します。
public DateTime CreationTime { get; set; }
protected BusinessException(SerializationInfo info, StreamingContext context)
: base(info, context)
{
CreationTime = (DateTime)info.GetValue("CreationTime", typeof(DateTime));
}
public override void GetObjectData(SerializationInfo info, StreamingContext context)
{
base.GetObjectData(info, context);
info.AddValue("CreationTime", CreationTime);
}