Couchbase文档数组元素达8个时抛出InvalidArgumentException异常求助
环境信息
- Couchbase版本:Couchbase Server Community Edition 7.2.2 build 6401
- NuGet包:
<PackageReference Include="Couchbase.Extensions.Caching" Version="3.3.5" /> <PackageReference Include="Couchbase.Extensions.DependencyInjection" Version="3.4.15" />
用户文档结构(设备数组示例)
用户文档包含存储设备信息的数组,结构片段如下:
{ "Devices": [ { "ClientVersion": "#", "CreatedAt": "2025-02-20T01:43:09.195092+03:00", "CreatedBy": null, "DeletedAt": null, "DeviceId": "#", "Id": "c3d1e0e8-d817-4d63-b66b-9112a3676fd8", "Ip": "#", "IsMainDevice": true, "LastOtpVerificationDate": "2025-02-20T01:43:09.195092+03:00", "Model": "#", "OperatingSystem": "#", "OriginalDeviceId": "BA5393F0-D283-4422-A21C-CE4BB8FC95E5", "Platform": "#", "SystemVersion": "#", "UpdatedAt": null, "UpdatedBy": null, "Version": "#" }, { ... } ] }
异常情况
检测到新设备时会向数组添加元素,但当数组元素数量达到8个时,抛出以下异常:
Exception of type 'Couchbase.Core.Exceptions.InvalidArgumentException' was thrown.
该异常在测试/预发布/生产环境均会出现,但本地调试无法复现。
堆栈跟踪
at Couchbase.Core.Retry.RetryOrchestrator.RetryAsync(BucketBase bucket, IOperation operation, CancellationTokenPair tokenPair)
at Couchbase.KeyValue.CouchbaseCollection.MutateInAsync(String id, IEnumerable1 specs, MutateInOptions options) at Business.Services.UserPasswordService.VerifyOtpForRecoveryAsync(String partnerCode, OtpForPasswordRecoveryRequestDto dto) in /app/Business/Services/UserPasswordService.cs:line 186 at WebAPI.Controllers.V1.PasswordController.VerifyOtpForRecoveryAsync(OtpForPasswordRecoveryRequestDto dto) in /app/WebAPI/Controllers/V1/PasswordController.cs:line 38 at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.TaskOfIActionResultExecutor.Execute(ActionContext actionContext, IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeActionMethodAsync>g__Awaited|12_0(ControllerActionInvoker invoker, ValueTask1 actionResultValueTask)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.g__Awaited|10_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.g__Awaited|13_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|20_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
at Microsoft.AspNetCore.Routing.EndpointMiddleware.g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
at Microsoft.AspNetCore.Localization.RequestLocalizationMiddleware.Invoke(HttpContext context)
at Infra.AspNetCore.Middlewares.RoleBasedAuthorizationMiddleware.Invoke(HttpContext context) in /app/Infra.AspNetCore/Middlewares/RoleBasedAuthorizationMiddleware.cs:line 59
at Infra.AspNetCore.Middlewares.RequestLoggerMiddleware.InvokeAsync(HttpContext context) in /app/Infra.AspNetCore/Middlewares/RequestLoggerMiddleware.cs:line 37
at WebAPI.Middlewares.SessionContextMiddleware.Invoke(HttpContext context) in /app/WebAPI/Middlewares/SessionContextMiddleware.cs:line 38
at Infra.AspNetCore.Middlewares.RequestInitializerMiddleware.InvokeAsync(HttpContext context) in /app/Infra.AspNetCore/Middlewares/RequestInitializerMiddleware.cs:line 30
at Microsoft.AspNetCore.Diagnostics.StatusCodePagesMiddleware.Invoke(HttpContext context)
at Infra.AspNetCore.Middlewares.ExceptionHandlerMiddleware.InvokeAsync(HttpContext context) in /app/Infra.AspNetCore/Middlewares/ExceptionHandlerMiddleware.cs:line 43
相关代码
MutateInSpecBuilder modifyProperties(MutateInSpecBuilder specs) { return _deviceService.CreateOrUpdateWithNoCommit(specs, user).Data; } var userCollection = await _collectionFactory.GetCollectionAsync(CollectionNames.Users); await userCollection.MutateInAsync(user.Id, specs => modifyProperties(specs)); public ServiceResult<MutateInSpecBuilder> CreateOrUpdateWithNoCommit(MutateInSpecBuilder specs, User user) { MutateInSpecBuilder modifyProperties(MutateInSpecBuilder spec) { var now = DateTimeOffset.Now; var registeredDevice = user.Devices.SingleOrDefault(s => s.OriginalDeviceId == originalDeviceId); if (registeredDevice.IsNull()) { for (int i = 0; i < user.Devices.Count; i++) { spec.Replace($"{nameof(User.Devices)}.[{i}].{nameof(UserDevice.IsMainDevice)}", false); spec.Replace($"{nameof(User.Devices)}.[{i}].{nameof(UserDevice.DeletedAt)}", now); user.Devices[i].IsMainDevice = false; user.Devices[i].DeletedAt = now; } var device = new UserDevice { Platform = platform, DeviceId = deviceId, OriginalDeviceId = originalDeviceId, SystemVersion = systemVersion, Model = deviceModel, OperatingSystem = operationSystem, ClientVersion = clientVersion, Version = version, Ip = ip, ... }; spec.ArrayAppend(nameof(User.Devices), device); user.Devices.Append(device); return spec; } } }
请问有人遇到过此类问题吗?
内容的提问来源于stack exchange,提问作者onurpekdemir

