【问题标题】:Servicestack 4.5.4 AutoBatch requests failed validationServicestack 4.5.4 AutoBatch 请求验证失败
【发布时间】:2018-01-12 17:58:46
【问题描述】:

我们正在编写一个从电子表格导入数据的 api。我们有一个使用自动批处理功能的创建端点,因为我们希望从 UI 进行一次调用,而不是每行一次调用。我们希望我们不必为 BulkCreate 实现特定的端点和验证器,并且可以使用服务堆栈的 AutoBatch 功能。我们遇到了一个问题,如果一个请求验证失败,它将停止运行其余请求并将异常返回给客户端。有没有办法配置或解决这个功能?我们理想的场景是我们可以发送请求数组并取回响应数组,其中包含成功的响应或填充的 ResponseStatus 而不会在客户端中变成异常,而无需自定义编写整个切片而不使用自动批处理。

[Route("/items/")]
public class CreateItem : IReturn<CreateItemResponse>
{
    public Item Item {get;set;}
}


public class CreateItemResponse : IHasResponseStatus
{
   public int ItemId {get;set;}
   public ResponseStatus ResponseStatus {get;set;}
}

说明性,嵌套规则将位于它们自己的验证器中,该验证器设置为子级

public class CreateItemValidator: AbstractValidator<CreateItem>
{
    public CreateItemValidator()
    {
        RuleFor(request => request.Item.PropA)
            .Must(someRuleThatFailsSometimes);
    }
}

服务

public class ItemService : Service
{
    public CreateItemResponse Any(CreateItem request)
    {
        CreateItem(request);
    }    
}

【问题讨论】:

    标签: servicestack


    【解决方案1】:

    这是自动批处理请求的行为,它将短路并返回第一个异常。它还将X-AutoBatch-Completed HTTP 标头 (HttpHeaders.XAutoBatchCompleted) 设置为已完成的请求数。

    要更改行为,您需要覆盖它Custom Batched Request Implementation,这将让您控制行为。

    public CreateItemResponse Any(CreateItem[] requests) { ... }
    

    或者,您可以通过继承 List&lt;T&gt; 创建自己的批处理服务,例如:

    public class CreateItems : List<CreateItem>, IReturn<CreateItemsResponse>
    {
        public Item[] Items {get;set;}
    }
    

    注意:你不应该在你的路由中使用/,即只使用/items 而不是/items/

    【讨论】:

    • 我很好奇短路行为背后的原因。因此,这意味着我们基本上不能在我们的任何服务中使用自动批处理,并且总是需要一次发送一个请求或实现我们自己的批处理。显然我来自某些类型的用例,短路是故意的还是其他设计决策的产物?
    • @Dstum 无法返回多个错误响应来指示哪些错误响应失败,即抛出的异常必须填充单个 ResponseStatus 属性。
    猜你喜欢
    • 2023-03-20
    • 2013-09-30
    • 2012-05-10
    • 2017-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-26
    • 1970-01-01
    相关资源
    最近更新 更多