9

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

  1. 客户端 (Java) 调用 WCF 服务 (LoginService)。
  2. 服务器检查授权是否正确,用户授权失败。
  3. 服务器抛出 UnauthorizedAccessException。
  4. WCF 以某种方式将其转换为故障。(* - 也见下文)
  5. 客户端必须能够知道如何读取此故障。

我想我只是很难理解这如何仍然是可互操作的,因为它期望 Java 知道如何翻译 .NET 从 UnauthorizedAccessException 编码的 SOAP 错误。

  • 此外,.NET 如何实际将异常转换为故障,故障代码、名称等内容。有些事情似乎是“duh”,比如故障名称可能是“UnauthorizedAccessException”,但我宁可确定也不要猜测。
4

3 回答 3

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 将定义故障,他们将看到包含已发送的 MySpecialFault 实例的序列化版本的 Detail 元素的故障。他们将能够读取该实例的所有属性。

于 2011-01-11T03:34:31.563 回答
4

自 v1.1 以来,错误一直是 SOAP 规范的一部分。它们在SOAP 规范中进行了解释。

由实现(WCF、Java 等)来确保按照规范处理故障。

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

于 2011-01-10T21:52:32.970 回答
2

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

每当在服务边界抛出 UnauthorizedAccessException 时,将其转换为 FaultException。这可以通过多种方式完成,例如使用 Microsoft 企业库异常处理块或实现 IErrorHandler 接口。

于 2011-01-10T22:12:38.873 回答