尝试搜索某些数据及其 RavenDB 附件时出现此错误,但我真的不明白出了什么问题。
System.ArgumentOutOfRangeException: Position cannot be negative, but was -4554
Parameter name: pos
这是我在搜索数据时使用的查询
var data = (await Session.Query<MyClass>()
.Where(x => x.Workspace == CurrentWorkspace)
.Search(x => x.Number, $"*{SearchQuery}*", options: SearchOptions.And)
.OrderByDescending(x => x.CreatedAt)
.Skip(skip)
.Take(take)
.ToListAsync())
.Select(x => x.LoadAttachments<MyClass>(Session))
.Select(Mapper.Map<MyDto>);
此查询用于search
我的一个 API 控制器的端点中。大多数情况下,查询按预期工作,我得到了我的数据。
但是在随机时间,我502 Bad Gateway
在这个特定的端点上收到一个错误,并且由于 dotnet 进程崩溃,api 崩溃了。它会自动重新启动,并且该端点上的接下来的几个请求正常工作。
我用 Rollbar 记录了所有未捕获的异常,并提供了上面提到的错误和这个堆栈跟踪。
at Sparrow.Json.BlittableJsonReaderBase.ThrowInvalidPosition(System.Int32 pos) in "C:\Builds\RavenDB-Stable-4.0\src\Sparrow\Json\BlittableJsonReaderBase.cs" line 233
at Sparrow.Json.BlittableJsonReaderObject.TryGetMember(Sparrow.StringSegment name, System.Object& result) in "C:\Builds\RavenDB-Stable-4.0\src\Sparrow\Json\BlittableJsonReaderObject.cs" line 461
at Sparrow.Json.BlittableJsonReaderObject.TryGet(Sparrow.StringSegment name, T& obj) in "C:\Builds\RavenDB-Stable-4.0\src\Sparrow\Json\BlittableJsonReaderObject.cs" line 244
at Raven.Client.Documents.Session.DocumentSessionAttachmentsBase.GetNames(System.Object entity) in "C:\Builds\RavenDB-Stable-4.0\src\Raven.Client\Documents\Session\DocumentSessionAttachmentsBase.cs" line 27
at MyProject.Core.Storage.DocumentStore.DocumentStoreAttachmentExtensions.LoadAttachments(MyProject.Core.Storage.DocumentStore.IDocumentStoreAttachment instance, Raven.Client.Documents.Session.IAsyncDocumentSession session) in "/Users/dtaalbers/Work/dtaalbers/Repos D/MyProject-api/src/MyProject.Core.Storage/DocumentStore/DocumentStoreAttachmentExtensions.cs" line 10
这是我用来获取 RavenDB 附件的扩展:
public static T LoadAttachments<T>(this IDocumentStoreAttachment instance, IAsyncDocumentSession session)
{
var attachments = session.Advanced.Attachments.GetNames(instance).ToList();
if (attachments.Any())
{
instance.Attachments = attachments
.Where(x => !x.Name.Contains("thumb"))
.Select(x => new DocumentStoreAttachment()
{
ContentType = x.ContentType,
Hash = x.Hash,
Name = x.Name,
Size = x.Size
});
}
return (T) instance;
}
这是因为 RavenDB 附件中的数据损坏而发生的事情吗?
此外,每次我得到 502 时,我的 Windows 服务器的事件查看器中都会出现一些日志。
最重要的错误记录如下:
Faulting application name: dotnet.exe, version: 2.1.26629.5, time stamp: 0x5b36971d
Faulting module name: coreclr.dll, version: 4.6.26628.5, time stamp: 0x5b356310
Exception code: 0xc0000005
Fault offset: 0x00000000001adaf7
Faulting process id: 0x12cc
Faulting application start time: 0x01d43964c4023b34
Faulting application path: C:\Program Files\dotnet\dotnet.exe
Faulting module path: C:\Program Files\dotnet\shared\Microsoft.NETCore.App\2.1.2\coreclr.dll
Report Id: a6168db0-a617-11e8-8135-a5deffecc34e
Faulting package full name:
Faulting package-relative application ID:
底部错误记录了这一点;
Application: dotnet.exe
CoreCLR Version: 4.6.26628.5
Description: The process was terminated due to an internal error in the .NET Runtime at IP 00007FFD8250DAF7 (00007FFD82360000) with exit code c0000005.
我不确定它们是否相关,但它们都同时发生在同一个 API 端点上。可悲的是,我似乎无法自己找到造成这种情况的原因。
任何帮助表示赞赏!
编辑:
我使用的是 RavenDB 服务器版本4.0.5
。但是我把它升级到4.1.0-rc-41000
了几天前。错误发生在两个版本上。