我们有一个使用webhttp绑定的WCF服务。用户通过身份验证,然后调用方法。在该方法中,我们在知道用户是否被授权进行呼叫之前检查与用户相关联的各种设置以及特定于该请求的一些信息。
由于这是WCF,我认为我应该抛出某种类型的FaultException,但是不清楚是否有最佳实践。
我的想法是,一旦我知道我将抛出什么异常,我就会添加一个IErrorHandler,它会将标头正确设置为403.
两个问题: 1)未经授权的请求是否存在标准的FaultException?即相当于http状态代码403? 2)我是否应该能够处理我将要抛出的异常并将响应代码更改为403?我能否通过自定义错误消息?我已经看到一些帖子,使用catch中的操作上下文设置头文件不会传播到客户端。
理想情况下,我可以将状态设置为403,并附加其他信息,例如“您必须成为管理员组的一员才能添加用户”
答案 0 :(得分:1)
由于您使用的是webhttp绑定,因此传统的WCF故障管理与此无关,最好使用WebFaultException和WebFaultException<>。
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状态代码非常重要。
答案 1 :(得分:0)
根据我的经验,抛出错误异常,至少使用wshttpbinding和basichttpbinding,可能会导致您的Web服务失败,因此我不推荐这种方法。
如果您要向未经授权的用户发送消息,只需发送HTML响应,将状态设置为400响应中的任何一个似乎合适。
但是从经验来看,错误异常,即使它们是对用户操作的受控响应而非实际处理错误,也会导致您的Web服务失败。我认为他们应该保留真正的处理例外。
答案 2 :(得分:0)
我继续从FaultException派生自定义异常,然后添加IErrorHandler来设置适当的标题。
这似乎是两个世界中最好的。代码只抛出从WCF中使用的异常派生的异常,并且特定于http绑定的所有处理都是通过业务逻辑之外的IErrorHandler完成的。