WCF/WebService:可互操作的异常处理
-
09-10-2019 - |
题
我知道WCF会将异常转换为故障并将其作为肥皂消息发送回,但我想知道这是否确实可以互操作。我想我很难弄清楚这种可能的情况:
- 客户端(Java)调用WCF服务(LoginService)。
- 服务器检查是否适当授权,用户授权失败。
- 服务器抛出未授权的accessexception。
- WCF以某种方式将其转换为故障。 (* - 也请参见下文)
- 客户必须能够知道如何读取此故障。
我想我只是很难理解这仍然可以互操作,因为它希望Java知道如何翻译肥皂故障,该错误是根据未经授权的Accessexception编码的。
- 另外,.NET如何实际上将异常转换为故障,是故障代码,名称等。某些事情似乎是“ duh”,也许是故障名称是“未授权的accessexception”,但是我' D肯定知道而不是猜测。
解决方案
没有“自动转换”。当您有未经治疗的例外时,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将定义故障,他们将看到一个错误的详细元素,其中包含发送的myspececealfault实例的序列化版本。他们将能够阅读该实例的所有属性。
其他提示
自v1.1以来,故障一直是肥皂规范的一部分。他们在 肥皂规范.
由实施(WCF,Java等)确保根据规范处理故障。
由于WCF根据SOAP规范将FARSEXCEPTIONS转换为故障,因此从WCF抛出的FARSEXCEPTIONS是可互操作的。
肥皂断层是可互操作的,但是.NET异常类不适用于肥皂断层。取而代之的是定义您自己的数据合同类(例如AccessFault),然后在Fardtract中使用它。看 http://msdn.microsoft.com/en-us/library/ms733841.aspx
每当在服务边界上抛出未授权的accessexception时,将其转换为fallexception。这可以通过几种方式完成,例如使用Microsoft Enterprise库异常处理块或实现IERRORHANDLER界面。
不隶属于 StackOverflow