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

当我调用CreateItemAsync时,为什么Cosmos DB给我一个“输入名' {是无效的'”的错误

孟健
2023-03-14

我正在开发一个ASP。Net核心3.0 API,Azure Cosmos DB作为持久性存储。这是我第一次尝试使用Cosmos DB。当我尝试创建一个新项目(文档)时,我在Postman中返回了一个错误,它说。。。

"Response status code does not indicate success: 400 Substatus: 0 
Reason: (Message: {\"Errors\":[\"The input name '{' is invalid. 
Ensure to provide a unique non-empty string less than '1024' characters."

我不知道是什么导致了这个问题。

我正在我的项目中使用微软.Azure.Cosmos v3.4.0 nuget

这是我的存储库中用于添加新帐户文档的方法。

public async Task AddAccountAsync(Account account)
{
    await _container.CreateItemAsync(account, new PartitionKey(account.Id));
}

这是我在调试模式下悬停在“Account Account”对象上时属性值的图片。

Cosmos DB中的容器是以 /id作为分区键设置的。

这是我在邮递员中的请求正文;

{
  "id": "00000000-0000-0000-0000-000000000000",
  "accountName": "Test Company 1",
  "accountType": 1,
  "ownerId": "00000000-0000-0000-0000-000000000000",
  "isTaxExempt": false,
  "mailJobProxyId": "00000000-0000-0000-0000-000000000000",
  "salesPersonId": "00000000-0000-0000-0000-000000000000"

}

这是帐户类;

public class Account
{

    // Aggregate state properties
    [JsonProperty(PropertyName = "id")]
    public AccountId Id { get; set; }

    [JsonProperty(PropertyName = "accountName")]
    public AccountName AccountName { get; set; }

    [JsonProperty(PropertyName = "accountType")]
    public AccountTypes AccountType { get; set; }

    [JsonProperty(PropertyName = "ownerId")]
    public OwnerId OwnerId { get; set; }

    [JsonProperty(PropertyName = "isTaxExempt")]
    public bool IsTaxExempt { get; set; }

    [JsonProperty(PropertyName = "mailJobProxyId")]
    public MailJobProxyId MailJobProxyId { get; set; }

    [JsonProperty(PropertyName = "salesPersonId")]
    public SalesPersonId SalesPersonId { get; set; }

    [JsonProperty(PropertyName = "addresses")]
    public List<Address.Address> Addresses { get; set; }

    [JsonProperty(PropertyName = "contacts")]
    public List<Contact.Contact> Contacts { get; set; }

    [JsonProperty(PropertyName = "postagePaymentMethods")]
    public List<PostagePaymentMethod.PostagePaymentMethod> PostagePaymentMethods { get; set; }

    public Account(string id, string accountName, AccountTypes accountType, string ownerId, Guid mailJobProxyId, Guid salesPersonId, bool isTaxExempt)
    {
        Id = AccountId.FromString(id);
        AccountName = AccountName.FromString(accountName);
        AccountType = accountType;
        OwnerId = OwnerId.FromString(ownerId);
        MailJobProxyId = new MailJobProxyId(mailJobProxyId);
        SalesPersonId = new SalesPersonId(salesPersonId);
        IsTaxExempt = isTaxExempt;
        Addresses = new List<Address.Address>();
        Contacts = new List<Contact.Contact>();
        PostagePaymentMethods = new List<PostagePaymentMethod.PostagePaymentMethod>();
        Status = Status.Active;

    }
}

如果您需要其他代码示例,请告诉我。

更新11/6/19在6:43p EST

这是Account tId值对象

   public class AccountId : Value<AccountId>
    {
        public string Value { get; internal set; }

        // Parameterless constructor for serialization requirements
        protected AccountId() { }

        internal AccountId(string value) => Value = value;

        // Factory pattern
        public static AccountId FromString(string accountId)
        {
            CheckValidity(accountId);
            return new AccountId(accountId);
        }

        public static implicit operator string(AccountId accountId) => accountId.Value;

        private static void CheckValidity(string value)
        {
            if (!Guid.TryParse(value, out _))
            {
                throw new ArgumentException(nameof(value), "Account Id is not a GUID.");
            }
        }
    }

下面是 Startup 中的初始化类.cs用于设置数据库和容器。

private static async Task<AccountsRepository> InitializeCosmosClientAccountInstanceAsync(IConfigurationSection configurationSection)
{
    var databaseName = configurationSection.GetSection("DatabaseName").Value;
    string uri = configurationSection.GetSection("Uri").Value;
    string key = configurationSection.GetSection("Key").Value;
    CosmosClientBuilder clientBuilder = new CosmosClientBuilder(uri, key);
    CosmosClient client = clientBuilder
                        .WithConnectionModeDirect()
                        .Build();
    DatabaseResponse database = await client.CreateDatabaseIfNotExistsAsync(databaseName);

    string containerName = configurationSection.GetSection("AccountsContainerName").Value;
    await database.Database.CreateContainerIfNotExistsAsync(containerName, "/id");
    AccountsRepository cosmosDbService = new AccountsRepository(client, databaseName, containerName);

    return cosmosDbService;
} 

这是错误发生时的堆栈跟踪;

stackTrace": "   at Microsoft.Azure.Cosmos.ResponseMessage.EnsureSuccessStatusCode()\r\n
at Microsoft.Azure.Cosmos.CosmosResponseFactory.ToObjectInternal[T]
(ResponseMessage cosmosResponseMessage, CosmosSerializer jsonSerializer)\r\n
at Microsoft.Azure.Cosmos.CosmosResponseFactory. 
<CreateItemResponseAsync>b__6_0[T](ResponseMessage cosmosResponseMessage)\r\n
at Microsoft.Azure.Cosmos.CosmosResponseFactory.ProcessMessageAsync[T]
(Task`1 cosmosResponseTask, Func`2 createResponse)\r\n   at
Delivery.Api.Infrastructure.AccountsRepository.AddAccountAsync(Account
account) in 
C:\\AzureDevOps\\Delivery\\Delivery.Api\\Accounts\\AccountsRepository.cs:line 20\r\n 
at Delivery.Api.Accounts.AccountsApplicationService.HandleCreate(Create cmd) 
in C:\\AzureDevOps\\Delivery\\Delivery.Api\\Accounts\\AccountsApplicationService.cs:line 43\r\n 
at Delivery.Api.Infrastructure.RequestHandler.HandleCommand[T](T request, Func`2 handler, ILogger log) 
in C:\\AzureDevOps\\Delivery\\Delivery.Api\\Infrastructure\\RequestHandler.cs:line 16

共有1个答案

邓令
2023-03-14

您可能需要为帐户 ID所有者 ID 等创建自定义转换器。

这是我的测试:

    class AccountIdConverter : JsonConverter
    {
        public override bool CanConvert(Type objectType)
        {
            return (objectType == typeof(AccountId));
        }

        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            return AccountId.FromString(JToken.Load(reader).ToString());
        }

        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            JToken.FromObject(value.ToString()).WriteTo(writer);
        }
    }

添加toString方法,并设置为使用自定义转换器

    [JsonConverter(typeof(AccountIdConverter))]
    public class AccountId
    {
        public string Value { get; internal set; }
        protected AccountId() { }

        internal AccountId(string value) => Value = value;

        public static AccountId FromString(string accountId)
        {
            CheckValidity(accountId);
            return new AccountId(accountId);
        }

        public static implicit operator string(AccountId accountId) => accountId.Value;

        public override string ToString()
        {
            return Value;
        }
        private static void CheckValidity(string value)
        {
            if (!Guid.TryParse(value, out _))
            {
                throw new ArgumentException(nameof(value), "Account Id is not a GUID.");
            }
        }
    }
    class Account
    {
        [JsonProperty(PropertyName = "id")]
        public AccountId Id { get; set; }

        public Account(string id)
        {
            Id = AccountId.FromString(id);
        }
    }
    static void Main(string[] args)
    {
        // Test toString 
        AccountId accountId = AccountId.FromString(Guid.NewGuid().ToString());
        Console.WriteLine(accountId.ToString());

        // Test AccountIdConverter
        Console.WriteLine(JsonConvert.SerializeObject(accountId));

        // Test for serializing Account
        Account account = new Account(Guid.NewGuid().ToString());
        string accountJson = JsonConvert.SerializeObject(account);
        Console.WriteLine(accountJson);

        // Test for deserializing Account
        Account accountDeserialized = JsonConvert.DeserializeObject<Account>(accountJson);
        Console.WriteLine(accountDeserialized.Id);

        Console.ReadLine();
    }

您可以看到包含Account tId对象的帐户对象可以按预期正确序列化和反序列化。

 类似资料:
  • 我试图在Eclipse中调试一个简单的java程序,结果出现了以下错误: 本机方法中的致命错误:JDWP未初始化任何传输,jvmtiError=AGENT_ERROR_TRANSPORT_INIT(197)错误:传输错误202:连接失败:连接超时错误:JDWPTransport dt_socket未能初始化,TRANSPORT_nit(510)JDWP退出错误AGENT_ERROR_TRANSPO

  • 我试图在返回Object的方法中简单地从用户获得输入。由于某种原因,将引发此错误: 线程“main”java.lang.reflect.invocationTargetException在java.base/jdk.internal.reflect.nativeMethodAccessorImpl.invoke0(原生方法)在java.base/jdk.internal.reflect.nativ

  • 问题内容: 我有这个web.xml 突出显示,IDE给出的错误是:“发现无效的内容,从element开始… 我还需要做什么? 问题答案: 使用以下表示法: 但我建议阅读此链接。本教程将使您了解在JSP 2.0的情况下如何避免在web.xml中声明标签库。

  • 我正试图编写一个java程序,将货币转换作为一个类赋值。我的代码几乎完全按照我希望的方式工作。执行时,它将要求用户输入日元对美元的汇率。输入任意一个数字,它就会正常工作。 但是,它会提示用户输入他们想要兑换成日元的美元金额。同样,这个想法是输入任何 但如果你在下一个空行输入一个数字,它就会进行转换!你甚至可以用空格输入数字:10 20 50 100。。。它将在单独的行中转换所有这些内容。 我只是想

  • 问题内容: 有一个过渡脚本,该脚本创建新的列DOCUMENT_DEFINITION_ID以MESSAGE_TYPE_ID + 5的值对其进行过渡,然后删除MESSAGE_TYPE_ID列。 第一次一切运行正常,但是当我第二次运行脚本时,出现此错误: 无效的列名“ MESSAGE_TYPE_ID”。 这没有任何意义,因为我已经验证了该列是否存在。 为什么? 问题答案: 试试这个 通过将更新包装在动态

  • 我有一个有效的用户名和密码,但是将输入的信息与数据库信息进行比较的语句是false。 这是我的login.jsp页面 我可以验证它连接到的MySQL数据库是否正确,并且SQL代码SELECT语句返回一行(我要登录的用户帐户)。我只需要一些关于如何将SQL语句结果与我的登录凭据进行比较的信息,甚至提取email和password的列值,以便在if语句中进行比较。 电子邮件被用作用户名 提前谢谢伙计们