当前位置: 首页 > 知识库问答 >
问题:

Cosmos DB: 响应状态代码不指示成功: BadRequest (400);子状态: 1001;原因: ();

于意智
2023-03-14

我正在使用Cosmos DB存储库并尝试为下面的对象添加新项目。

[Container(nameof(Notifications))]
    [PartitionKeyPath("/UserUUId")]
    public class Notifications : Item
    {
        [JsonProperty(PropertyName = "RequestID", Order = 2)]
        public string RequestID { get; set; }

        [JsonProperty(PropertyName = "NotificationType", Order = 3)]
        public int NotificationType { get; set; }

        [JsonProperty(PropertyName = "SubType", Order = 4)]
        public string SubType { get; set; }

        [JsonProperty(PropertyName = "UserUUId", Order = 5)]
        public string UserUUId { get; set; }

        [JsonProperty(PropertyName = "Payer", Order = 6)]
        public string Payer { get; set; }

        [JsonProperty(PropertyName = "PayerName", Order = 7)]
        public string PayerName { get; set; }

        [JsonProperty(PropertyName = "Account", Order = 8)]
        public string Account { get; set; }

        [JsonProperty(PropertyName = "AccountName", Order = 9)]
        public string AccountName { get; set; }

        [JsonProperty(PropertyName = "Created", Order = 10)]
        public DateTime Created { get; set; }

        [JsonProperty(PropertyName = "Updated", Order = 11)]
        public DateTime? Updated { get; set; }

        [JsonProperty(PropertyName = "Status", Order = 12)]
        public int Status { get; set; }

        [JsonProperty(PropertyName = "MetaData", Order = 13)]
        public Dictionary<string, string> MetaData { get; set; }

        protected override string GetPartitionKeyValue() => UserUUId;
    }

这是我添加新项目的代码代码:

public class UINotificationPublisher : IUINotificationPublisher
{

   private readonly IRepository<Notifications> _uiNotificationsRepository;

    public UINotificationPublisher(
        IRepositoryFactory factory
    
        )
    {
        _uiNotificationsRepository = factory.RepositoryOf<Notifications>();

    }

    public async Task PublishAsync(IEnumerable<UserSubscriptions> userSubscriptions, CardGroupEvent @event, ILogger logger)
    {
        try
        {
            var uiSubscriptions = userSubscriptions
                .Where(x => x.Events.Any(y => y.EventType == (int)EventType.CARD_GROUP_CHANGED && y.Channels.Contains((int)ChannelType.UI)));

            if (uiSubscriptions.Any())
            {
                logger.LogInformation($"UI notification subscriptions found, requestID:{@event.RequestID}");

                List<Notifications> uiNotifications = new List<Notifications>();

                foreach (var item in uiSubscriptions)
                {
                    logger.LogInformation($"creating UI notification for UUID:{item.UUID}. requestID:{@event.RequestID}");

                    uiNotifications.Add(CreateItemAsync(item, @event));

                    logger.LogInformation($"successfully created UI Notification for UUID:{item.UUID}: {@event.RequestID}");
                }
                await _uiNotificationsRepository.CreateAsync(uiNotifications);
            }
            else
                logger.LogInformation($"No UI notification subscriptions found: requestID:{@event.RequestID}");
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

    private Notifications CreateItemAsync(UserSubscriptions userSubscription, CardGroupEvent @event)
    {
        Notifications notifications = new Notifications
        {
            Id = Guid.NewGuid().ToString(),
            Created = DateTime.UtcNow,
            RequestID = @event.RequestID,
            NotificationType = (int)EventType.CARD_GROUP_CHANGED,
            SubType = @event.EventSubType,
            UserUUId = userSubscription.UUID,
            Payer = @event.PayerNumber,
            PayerName = @event.PayerName,
            Account = @event.AccountNumber,
            AccountName = @event.AccountName,
            MetaData = GetMetaData(@event),
            Status = (int)NotificationStatus.UnRead

        };
      
        return notifications;
        
    }

    private Dictionary<string, string> GetMetaData(CardGroupEvent @event)
    {
       

        var metaData = new Dictionary<string, string>();
     
        metaData.Add(nameof(@event.AccountNumber), @event.AccountNumber);
        metaData.Add(nameof(@event.AccountName), @event.AccountName);
      
        return metaData;
    }
}

Cosmos DB Respository CreateAsync:

插入新项目时出现以下异常:

"响应状态码不表示成功:BadRequest(400);Substatus:1001;ActivityId:68af0c72-ff2d-4055-8898-b94a08f18ead;原因:();"

下面是堆栈跟踪:

在Microsoft.Azure.Cosmos.ResponseMessage。在Microsoft.Azure.Cosmos.CosmosResponseFactoryCore中确保成功状态代码()。ProcessMessage[T](ResponseMessage ResponseMessage,Func2 createResponse)位于Microsoft.Azure.Cosmos.CosmosResponseFactoryCore。在Microsoft.Azure.Cosmos.ContainerCore.d__541.MoveNext()的System.Runtime.ExceptionServices.Exception DispatchInfo中创建ItemResponse[T](ResponseMessage和ResponseMessage)。在System.Runtime.CompilerServices.TaskWaiter中抛出()。在System.Runtime.CompilerServices.TaskWaiter上的ThrowForNonSuccess(任务到任务)。在System.Runtime.CompilerServices.configuredTaskawaitable 1.configuradTaskwaiter中处理成功和调试通知(任务任务)。Microsoft.Azure.Cosmos.ClientContextCore.d__391.MoveNext()中的GetResult()在System.Runtime.ExceptionServices.Exception DispatchInfo中。在System.Runtime.CompilerServices.TaskWaiter中抛出()。在System.Runtime.CompilerServices.TaskWaiter上的ThrowForNonSuccess(任务到任务)。在System.Runtime.CompilerServices.TaskWaiter1.GetResult()和Microsoft.Azure.Cosmos.ClientContextCore.d__301.MoveNext()中的System.Runtimes.ExceptionServices.Exception DispatchInfo中的HandlenonSuccess和DebuggerNotification(任务任务任务任务)。在System.Runtime.CompilerServices.TaskWaiter中抛出()。在System.Runtime.CompilerServices.TaskWaiter上的ThrowForNonSuccess(任务到任务)。在System.Runtime.CompilerServices.configuredTaskawaitable 1.configuradTaskwaiter中处理成功和调试通知(任务任务)。Microsoft.Azure.CosmosRepository.DefaultRepository1.d__7.MoveNext()中的GetResult()位于System.Runtime.ExceptionServices.Exception DispatchInfo中。在System.Runtime.CompilerServices.TaskWaiter中抛出()。在System.Runtime.CompilerServices.TaskWaiter上的ThrowForNonSuccess(任务到任务)。System.Threading.Tasks.ValueTask1.get_Result()在System.Runtime.CompilerServices.ValuetaskWaiter1.GetResult()位于C:\notification Subscriber\dev\notification Microservices\CardGroupEventSubscribers\CardGroup EventSubscruber\Publishers\UINotificationPublisher.d__2.MoveNext()。政务司司长:第49行

共有1个答案

施晗昱
2023-03-14

这在错误请求的故障排除文档中有所介绍

带有此错误的响应意味着您正在执行一个操作并传递一个与预期属性的文档正文值不匹配的分区键值。如果集合的分区键值路径 /myPartitionKey,则文档具有一个名为my分区键值的属性,其值与调用SDK方法时提供的分区键值不匹配。

您没有共享调用Cosmos DB SDK的代码(只是调用一些存储库对象),因此很难指向正确的代码,但如果您正在调用例如:

container.CreateItem(<item>, new PartititionKey(pkValue))

此错误意味着您传递的新分区键 (pkValue) 不正确,它不是项目中容器的分区键定义属性的值。

代码可能假设分区键定义已启用(例如,/Payer),但容器的实际分区键定义是另一个(例如,\id)。

 类似资料:
  • 我在临时服务器上推送了我的textract代码,现在我收到了一个错误。 它正在开发一个系统。我不明白为什么会这样。 我正在使用dotnet core 3.0 我遵循这里提供的代码示例。[https://github.com/aws-samples/amazon-textract-code-samples/tree/master/src-csharp] 我对IAM的资质有疑问。为此,我在stagin

  • 问题内容: 我有一个API调用,我需要对其进行一些检查并可能返回各种状态代码。我不需要自定义视图或任何东西,我只需要返回正确的代码。如果用户未通过适当的凭据,则需要返回401状态。如果他们尚未发送受支持的请求格式,则需要返回400状态。 因为它是一个API,所以我真正想做的就是设置响应状态并以一条简单的愚蠢消息退出,该消息说明请求失败的原因(可能使用)。刚好足以完成工作,但我还无法使其正常工作。我

  • 我无法从类似200201的响应中获取成功响应状态代码。。我们可以很容易地从类中获得错误代码,比如和。是否有获取状态代码的解决方法?

  • 我需要能够访问请求的状态代码。呼叫可以通过200或201两种方式成功。这在通过邮递员呼叫但使用web客户端时很明显,到目前为止我还无法确定发生了什么。 我在想也许我可以在 onStatus() lambda 函数中使用设置一个整数变量。甚至可以访问 lambda 函数中的外部变量吗?

  • 我希望返回http状态代码和响应对象。如果我只是在失败场景中返回response object,则状态返回为200。但是我希望将服务返回的状态(例如:403)与响应对象一起发送。但是下面的代码只是返回消息和状态。在这种情况下,我想要响应对象orderdetails对象,它有失败原因和其他字段。如何将对象传递回客户端有什么帮助吗?

  • 我使用curl获取http头以查找http状态代码并返回响应。我使用以下命令获取http头