尝试调用 DynamoDBContext 对象的 CreateBatchWrite<T> 方法时出现错误“AsyncLocal 中不存在实体”

Rom*_*ews 3 amazon-web-services amazon-dynamodb .net-core aws-xray

我已经在我的开发计算机中创建了一个 DynamoDb 表,并且尝试使用对象CreateBatchWrite<T>方法从我的 .NET Core 应用程序插入几行DynamoDBContext。我可以从 localhost:8000/shell url 从 DynamoDB Javascript Shell 窗口查询表,它返回的行数为 0。但是当尝试调用该CreateBatchWrite<T>方法时,我收到错误“ Entity does not believe in AsyncLocal ” 。

小智 5

在执行任何 DynamoDB API 方法之前添加此行:

AWSXRayRecorder.Instance.ContextMissingStrategy = ContextMissingStrategy.LOG_ERROR;
Run Code Online (Sandbox Code Playgroud)

您可以在 GitHub 讨论中找到更多信息https://github.com/aws/aws-xray-sdk-dotnet/issues/69#issuecomment-482688754

此外,您还需要导入这两个包。

using Amazon.XRay.Recorder.Core;
using Amazon.XRay.Recorder.Core.Strategies;
Run Code Online (Sandbox Code Playgroud)


Ali*_*son 5

解释

使用 X-Ray 时,当尝试创建没有Parent Segment 的SubSegment时,就会发生这种情况。根据您的设置,当您运行查询时,它可能会尝试创建子段,但由于没有父段而失败。

在本地运行 Lambda 函数时,这种情况很常见,因为模拟 Lambda 测试工具不会像 AWS 上的实际 Lambda 环境那样为您创建段。这也可能发生在其他场景中。

更多详细信息请参见:https ://github.com/aws/aws-xray-sdk-dotnet/issues/125

解决方案

解决此问题的最简单方法是在本地禁用 X-Ray(因为您可能不想在本地生成跟踪):

添加appsettings.Development.json以下内容:

"XRay": {
  "DisableXRayTracing": "true",
  "UseRuntimeErrors": "false",
  "CollectSqlQueries": "false"
}
Run Code Online (Sandbox Code Playgroud)

重要的是DisableXRayTracingequals true 。

确保在属性窗口中将其appsettings.Development.json设置为“始终复制” 。您可以通过将其包含在您的.csproj

<ItemGroup>
  <None Update="appsettings.Development.json">
    <CopyToOutputDirectory>Always</CopyToOutputDirectory>
  </None>
  <None Update="appsettings.json">
    <CopyToOutputDirectory>Always</CopyToOutputDirectory>
  </None>
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

如果您确实想在本地跟踪事物,请确保仅在本地运行时创建父段(在 AWS 上,这会导致问题,因为您将有两个父段,一个由您手动创建,另一个由 AWS 创建)。