如何使用ServiceStack将HTTP状态代码设置为201,而不将业务逻辑与传输逻辑混合?

时间:2014-08-12 11:13:23

标签: servicestack

当我执行POST请求以便在服务器上创建对象时,我希望将201 HTTP状态代码设置为带有URI的响应头。

问题在于我不喜欢装饰"我的服务中的HTTP响应头,因为我将业务逻辑与传输逻辑混合在一起。

推荐的方法是什么?

1 个答案:

答案 0 :(得分:2)

您可以在创建操作中使用属性。这清楚地表明了方法将返回的状态,而不是直接参与动作逻辑本身。

[AddHeader(HttpStatusCode.Created)]
public int Post(TestRequest request)
{
    return 0; // Record Id
}

更精细的方法是,如果你真的想避免在你的服务中标记任何东西,那就是用一个可以被响应过滤器检测到的接口来装饰你的响应对象DTO,这将添加必要的标题。

因此,如果我们使用名为ICreated

的接口
public interface ICreated
{
}

我们可以将它添加到我们的回复DTO:

public class UserCreatedResponse : ICreated
{
    public int Id { get; set; }
}

然后当我们从我们的行动方法中返回那种类型的回应时:

public class TestService : Service
{
    public UserCreatedResponse Post(CreateUserRequest request)
    {
        return new UserCreatedResponse { Id = 123 };
    }
}

如果我们在AppHost Configure方法中应用以下过滤器,它会收到正确的标题:

public override void Configure(Funq.Container container)
{
    GlobalResponseFilters.Add((req, res, obj) => {
        var result = obj as ICreated;
        if(result != null) {
            res.StatusCode = (int)HttpStatusCode.Created;
            res.StatusDescription = "Created";
        }
    });
}

假设请求DTO,例如:

[Route("/User","POST")]
public class CreateUserRequest : IReturn<UserCreatedResponse>
{
    public string Name { get; set; }
    public int Age { get; set; }
}