1

我们有一个 WCF 服务,使用 webhttp 绑定。用户通过身份验证,然后调用一个方法。在该方法中,我们会检查与用户相关的各种设置以及特定于请求的一些信息,然后才能知道用户是否有权拨打电话。

由于这是 WCF,我认为我应该抛出某种 FaultException,但尚不清楚是否有最佳实践。

我的想法是,一旦我知道我将抛出什么异常,我会添加一个 IErrorHandler ,它将标头正确设置为 403。

两个问题:1)对于未经授权的请求是否有标准的 FaultException?即相当于403的http状态码?2)我应该能够处理我将抛出的异常并将响应代码更改为 403 吗?我可以通过自定义错误消息吗?我已经看到一些帖子使用捕获中的操作上下文设置标头不会传播到客户端。

理想情况下,我可以使用附加信息将状态设置为 403,例如“您必须是管理员组的成员才能添加用户”

4

3 回答 3

1

因为您使用的是 webhttp 绑定,所以传统的 WCF 故障管理在这里不相关,最好使用WebFaultExceptionWebFaultException<>

Public string MyOperation()
   // Operation logic
   // ...   
   throw new WebFaultException<string>("You must be part of the administrators group to add a user", HttpStatusCode.Forbidden);
}

如您所想,在开发 HTTP(类 REST)服务时使用标准 HTTP 状态代码非常重要。

于 2014-05-20T06:49:09.127 回答
0

根据我的经验,至少使用 wshttpbinding 和 basichttpbinding 抛出错误异常会导致您的 Web 服务失败,因此我不推荐这种方法。

如果您想向未经授权的用户发送回消息,只需发送一个 HTML 响应,将状态设置为 400 个响应中的任何一个似乎合适的响应。

但根据经验,故障异常,即使它们是对用户操作的受控响应,而不是实际处理错误,也会导致您的 Web 服务失败。我认为他们应该保留真正的处理异常。

于 2014-05-20T06:59:36.623 回答
0

我继续从 FaultException 派生自定义异常,然后添加一个 IErrorHandler 来设置适当的标头。

这似乎是两全其美。代码只抛出从 WCF 中使用的异常派生的异常,并且所有特定于 http 绑定的处理都是通过业务逻辑外部的 IErrorHandler 完成的。

于 2014-05-22T19:17:08.027 回答