“错误协定”示例演示如何将错误信息从服务传达到客户端。本示例基于入门示例,并且向服务添加了一些附加代码以将内部异常转换为错误。客户端试图执行除数为零的运算以在服务上强制产生错误情况。
提示
本主题的最后介绍了此示例的设置过程和生成说明。
已将计算器协定修改为包括 FaultContractAttribute,如下面的示例代码所示。
[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")]
public interface ICalculator
{
[OperationContract]
int Add(int n1, int n2);
[OperationContract]
int Subtract(int n1, int n2);
[OperationContract]
int Multiply(int n1, int n2);
[OperationContract]
[FaultContract(typeof(MathFault))]
int Divide(int n1, int n2);
}
FaultContractAttribute 属性指示 Divide
运算可能返回一个 MathFault
类型的错误。错误可以是可序列化的任何类型。在本例中,MathFault
为数据协定,如下所示:
[DataContract(Namespace="http://Microsoft.ServiceModel.Samples")]
public class MathFault
{
private string operation;
private string problemType;
[DataMember]
public string Operation
{
get { return operation; }
set { operation = value; }
}
[DataMember]
public string ProblemType
{
get { return problemType; }
set { problemType = value; }
}
}
如下面的示例代码所示,发生除数为零异常时,Divide
方法引发 FaultException 异常。此异常导致向客户端发送一个错误。
public int Divide(int n1, int n2)
{
try
{
return n1 / n2;
}
catch (DivideByZeroException)
{
MathFault mf = new MathFault();
mf.operation = "division";
mf.problemType = "divide by zero";
throw new FaultException<MathFault>(mf);
}
}
通过请求除数为零,客户端代码强制产生错误。运行示例时,操作请求和响应将显示在客户端控制台窗口中。您会看到将除数为零报告为错误。在客户端窗口中按 Enter 可以关闭客户端。
Add(15,3) = 18
Subtract(145,76) = 69
Multiply(9,81) = 729
FaultException<MathFault>: Math fault while doing division. Problem: divide by zero
Press <ENTER> to terminate client.
客户端通过捕获相应 FaultException<MathFault>
异常来完成此操作:
catch (FaultException<MathFault> e)
{
Console.WriteLine("FaultException<MathFault>: Math fault while doing " + e.Detail.operation + ". Problem: " + e.Detail.problemType);
client.Abort();
}
默认情况下,不向客户端发送意外异常的详细信息,以防止服务实现的详细信息泄漏出服务的安全边界之外。FaultContract
提供一种方式,用于说明协定中的错误并将特定异常类型标记为适合于传输到客户端。FaultException<T>
提供用于将错误发送到使用方的运行时机制。
但是,在调试时查看服务失败的内部详细信息很有用。若要关闭上述安全行为,您可以指示在发送到客户端的错误中必须包括服务器上每个未处理的异常的详细信息。这是通过将 IncludeExceptionDetailInFaults 设置为 true 来完成的。您可以在代码中或在配置中设置它,如下面的示例所示。
<behaviors>
<serviceBehaviors>
<behavior name="CalculatorServiceBehavior">
<serviceMetadata httpGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="True" />
</behavior>
</serviceBehaviors>
</behaviors>
此外,必须通过在配置文件中将服务的 behaviorConfiguration 属性设置为“CalculatorServiceBehavior”,以将行为与服务相关联。
若要在客户端上捕获这样的错误,必须捕获非泛型 FaultException。
此行为仅用于调试目的,切勿在生产中启用它。
设置、生成和运行示例
若要生成 C# 或 Visual Basic .NET 版本的解决方案,请按照生成 Windows Communication Foundation 示例中的说明进行操作。
若要用单机配置或跨计算机配置来运行示例,请按照运行 Windows Communication Foundation 示例中的说明进行操作。
Send comments about this topic to Microsoft.
© 2007 Microsoft Corporation. All rights reserved.