ServiceStack在Request Filter中结束响应时设置Response DTO

时间:2014-06-19 14:25:54

标签: c# servicestack

我使用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响应对象吗?

2 个答案:

答案 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");