我们正在编写一个从电子表格导入数据的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);
}
}
答案 0 :(得分:1)
这是AutoBatched Requests的行为,它会短路并返回第一个Exception。它还将X-AutoBatch-Completed
HTTP标头(HttpHeaders.XAutoBatchCompleted)设置为已完成的请求数。
要更改行为,您需要覆盖它Custom Batched Request Implementation,以便您控制行为。
public CreateItemResponse Any(CreateItem[] requests) { ... }
或者,您可以通过继承List<T>
来创建自己的批量服务,例如:
public class CreateItems : List<CreateItem>, IReturn<CreateItemsResponse>
{
public Item[] Items {get;set;}
}
注意:您的路线不应该跟踪
/
,即只使用/items
的{{1}}个。{/ p>