我使用ServiceStack来创建API。我想在请求过滤器中执行身份验证。我创建了一个继承RequestFilterAttribute并覆盖方法
的类void Execute(IRequest req, IResponse res, object requestDto)
在身份验证失败时的覆盖中,我想阻止请求继续使用服务方法,并且我想返回特定的消息。为了结束请求,我可以使用以下方法之一:
res.Close();
res.End();
res.EndHttpHandlerRequest();
res.EndRequest();
res.EndRequestWithNoContent();
它们阻止在服务中执行该方法。在结束响应时,我想要一个带有消息的特定DTO。因此,在结束响应之前,我将DTO对象分配给属性
res.Dto = myResponseDto;
但是,API调用的结果是没有任何数据。任何人都可以帮助在过滤器中阻止访问ServiceStack服务实现的请求,但是返回所需的DTO响应对象吗?
答案 0 :(得分:1)
使用过滤器,您必须处理原始响应。因此,如果您想在过滤器中结束响应并返回DTO响应,则需要在调用Write
方法之前EndRequest
DTO对象到响应。
如果您发送Unauthorized
错误,则将状态代码设置为HttpStatusCode.Unauthorized
(401)通常是客户端识别其请求失败所需的全部内容。
public override void Execute(IRequest req, IResponse res, object requestDto)
{
// Perform you filter actions
if(authorised)
return;
// Not authorised, return some object
var responseDto = new {
SomeValue = "You are not authorised to do that."
};
// Set the status code
res.StatusCode = (int)HttpStatusCode.Unauthorized;
// You may need to handle other return types based on `req.AcceptTypes`
// This example assumes JSON response.
// Set the content type
res.ContentType = "application/json";
// Write the object
res.Write(responseDto.toJson());
// End the request
req.EndRequest();
}
希望有所帮助。
答案 1 :(得分:1)
您可以使用以下说明,其中res.Dto
可以更改为您想要的任何内容:
res.ContentType = req.ResponseContentType;
res.StatusCode = (int)HttpStatusCode.Unauthorized;
res.Dto = DtoUtils.CreateResponseDto(requestDto, new ResponseStatus("401", "Unauthorized"));
res.EndRequest();
如果您不需要在回复中嵌入数据,则可以在过滤器中使用throw new AuthenticationException("Error reason");
。