我正在编写一个 wcf 服务,该服务需要处理定制的遗留消息格式 (xml)。当我第一次解析传入的 xml 时,它位于 IDispatchOperationSelector 的 SelectOperation 方法中。
我要做的第一件事是根据 xsd 验证 xml,以确保传入消息的格式正确。如果验证失败,我将抛出 XmlSchemaValidationException 并在 IErrorHandler 实现中捕获它,目的是向客户端返回 400 - Bad Request 错误。
不幸的是,在 IErrorHandler 的 ProvideFault 方法中,OperationContext.Current 为空。我认为这是因为 OperationSelector 是 OperationContext.Current 创建的一部分或之前被调用。因此,我决定在 OperationSelector 中返回字符串“error”,并将 message.Headers.Action 也设置为“error”,并将所需的异常添加到消息属性中,而不是在 OperationSelector 中抛出错误,然后在创建操作上下文后抛出它。
问题是我的代码中要命中的下一个扩展点是 ServiceAuthenticationManager.Authenticate 方法。如果我检查 message.Headers.Action 并找到错误,然后在此方法中抛出该错误,它会被框架吞下,并且传递给我的错误处理程序的错误是“用户未通过身份验证”,我认为这是有道理的。
所以我想我的问题是,WCF 中是否有一个扩展点可以让我在这两种方法之间抛出这个错误?