WCF/WebService:可互操作的异常处理

mic*_*ael 9 wcf exception wcf-interoperability faultexception

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

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

我想我只是很难理解它是如何仍然可以互操作的,因为它期望Java知道如何转换.NET编译的UnisonAccessException的SOAP错误.

  • 此外,.NET如何实际将异常转换为故障,故障代码,名称等等.有些事情似乎是"呃",也许故障名称是"UnauthorizedAccessException",但是我d相当肯定而不是猜测.

Joh*_*ers 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)});
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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