WCF plus业务逻辑层场景的异常处理

WCF plus业务逻辑层场景的异常处理,wcf,exception,business-logic-layer,faultexception,faultcontract,Wcf,Exception,Business Logic Layer,Faultexception,Faultcontract,我的服务只是调用BusinessLogicLayer方法,将整个业务逻辑放在其中。我想知道处理BL引发的异常的最佳实践是什么?不仅是致命的异常,还有逻辑应用程序异常,比如我的BL在找不到用户时抛出的UserNotFoundException 我应该在哪里将这些异常转换为客户端将看到的FaultException 我是否应该从BL中抛出业务异常,然后将它们捕获到服务调用中,然后转换为FaultException并返回到客户端?或者BL应该提出已经对客户友好的例外情况 提前感谢:我想说从业务逻辑层抛

我的服务只是调用BusinessLogicLayer方法,将整个业务逻辑放在其中。我想知道处理BL引发的异常的最佳实践是什么?不仅是致命的异常,还有逻辑应用程序异常,比如我的BL在找不到用户时抛出的UserNotFoundException

我应该在哪里将这些异常转换为客户端将看到的FaultException

我是否应该从BL中抛出业务异常,然后将它们捕获到服务调用中,然后转换为FaultException并返回到客户端?或者BL应该提出已经对客户友好的例外情况


提前感谢:

我想说从业务逻辑层抛出业务异常,这将使您的业务逻辑层与wcf实现解耦。在服务调用中,您可以覆盖ApplyDispatchBehavior并在其中添加错误处理程序,如

重写IServiceBehavior.ApplyDispatchBehavior行为

错误处理程序


我会说,从业务逻辑层抛出业务异常,这将使您的业务逻辑层与wcf实现解耦。在服务调用中,您可以覆盖ApplyDispatchBehavior并在其中添加错误处理程序,如

重写IServiceBehavior.ApplyDispatchBehavior行为

错误处理程序


标准.Net异常在服务器端正确序列化,在客户端反序列化。 默认情况下,不是我们的。为什么? 在调试会话期间向客户端发送业务异常可能是最佳做法: -无需将异常数据放入[DataMember]对象中 -比一个简单的字符串ExceptionFault有更多的信息

但在将代码投入生产时,请注意不要发送异常。如果您的服务暴露在互联网上,可能会导致安全漏洞,并向黑客披露详细信息

为了向客户发送业务例外情况,最佳做法和一些强制性做法是:

1/打开serviceDebugBehavior

3/业务异常应标记为可序列化

[Serializable]
public class BusinessException : Exception
{ ... }
4/为了在客户端将业务异常作为FaultException正确反序列化,实现负责反序列化的构造函数非常重要。否则您将得到一个通用的FaultException

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);
}

标准.Net异常在服务器端正确序列化,在客户端反序列化。 默认情况下,不是我们的。为什么? 在调试会话期间向客户端发送业务异常可能是最佳做法: -无需将异常数据放入[DataMember]对象中 -比一个简单的字符串ExceptionFault有更多的信息

但在将代码投入生产时,请注意不要发送异常。如果您的服务暴露在互联网上,可能会导致安全漏洞,并向黑客披露详细信息

为了向客户发送业务例外情况,最佳做法和一些强制性做法是:

1/打开serviceDebugBehavior

3/业务异常应标记为可序列化

[Serializable]
public class BusinessException : Exception
{ ... }
4/为了在客户端将业务异常作为FaultException正确反序列化,实现负责反序列化的构造函数非常重要。否则您将得到一个通用的FaultException

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);
}
[Serializable]
public class BusinessException : Exception
{ ... }
protected BusinessException(SerializationInfo info, StreamingContext context)
  : base(info, context)
{}
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);
}