WCF / Web服务:互操作性异常处理

时间:2011-01-10 19:34:26

标签: wcf exception faultexception wcf-interoperability

据我所知,WCF会将异常转换为错误并将其作为SOAP消息发回,但我想知道这是否真的可以互操作。我想我正在努力弄清楚这种可能的情况:

  1. 客户端(Java)调用WCF服务 (login服务)。
  2. 服务器检查是否有正确的授权,用户授权失败。
  3. 服务器抛出UnauthorizedAccessException。
  4. WCF以某种方式将其转换为故障。 (* - 见下面)
  5. 客户必须知道如何阅读此故障。
  6. 我想我只是很难理解它如何仍然可以互操作,因为它期望Java知道如何翻译.NET编码的UnisonAccessException的SOAP错误。

    • 此外,.NET如何实际将异常转换为故障,故障代码,名称等等。有些事情似乎是“呃”,也许故障名称是“UnauthorizedAccessException”,但我宁愿知道而不是猜测。

3 个答案:

答案 0 :(得分:9)

没有“自动转换”。当您有未处理的异常时,WCF将返回错误(我忘记了哪一个)。但是,既然你没有宣布这个错误,那么很多(如果不是大多数)客户端如果你退回它们就会失败。

您应该定义自己的错误并返回它们。考虑:

[DataContract]
public class MySpecialFault
{
    public string MyMessage { get; set; }
}

[ServiceContract]
public interface IMyService
{
    [FaultContract(typeof (MySpecialFault))]
    [OperationContract]
    void MyOperation();
}

public class MyService : IMyService
{
    public void MyOperation()
    {
        try
        {
            // Do something interesting
        }
        catch (SomeExpectedException ex)
        {
            throw new FaultException<MySpecialFault>(
                new MySpecialFault {MyMessage = String.Format("Sorry, but {0}", ex.Message)});
        }
    }
}

任何能够处理故障的客户都会处理这个问题。 WSDL将定义错误,他们将看到Detail元素的错误,其中包含已发送的MySpecialFault实例的序列化版本。他们将能够读取该实例的所有属性。

答案 1 :(得分:4)

自v1.1以来,故障一直是SOAP规范的一部分。它们在SOAP Specification中解释。

由实现(WCF,Java等)来确保根据规范处理Fault。

由于WCF根据SOAP规范将FaultExceptions转换为Faults,因此从WCF抛出的FaultExceptions是可互操作的。

答案 2 :(得分:2)

SOAP错误是可互操作的,但.Net异常类不适合在SOAP错误中使用。而是定义您自己的DataContract类(例如AccessFault),然后在FaultContract中使用它。 见http://msdn.microsoft.com/en-us/library/ms733841.aspx

每当在服务边界抛出UnauthorizedAccessException时,都会将其转换为FaultException。 这可以通过多种方式完成,例如使用Microsoft Enterprise Library Exception Handling Block或实现IErrorHandler接口。