据我所知,WCF会将异常转换为错误并将其作为SOAP消息发回,但我想知道这是否真的可以互操作。我想我正在努力弄清楚这种可能的情况:
我想我只是很难理解它如何仍然可以互操作,因为它期望Java知道如何翻译.NET编码的UnisonAccessException的SOAP错误。
答案 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接口。