Не удалось проанализировать значение '' как ResourceId в Cosmos DocumentQuery в функции Azure

У меня есть функция Azure 2.0.12562, которая при запросе CosmosDB получает следующую ошибку.

Ошибка: DoesCosmosContain не удалось: не удалось проанализировать значение '' как ResourceId., Windows / 10.0.18362 documentdb-netcore-sdk / 2.4.0

Запись в Космосе выглядит как

{
    "id": "851a3506-3915-4f7c-9e32-32d927055555",
    "_rid": "Tg8ZAI-iVnQBAAAAAAAADQ==",
    "_self": "dbs/Tg8ZAA==/colls/Tg8ZAI-iVnQ=/docs/Tg8ZAI-iVnQBAAAAAAAADQ==/",
    "_etag": "\"0f00e289-0000-0500-0000-5d1676600000\"",
    "Prop_0": "555",
    "Prop_1": "5551234",
    "_attachments": "attachments/",
    "_ts": 1561755555
}

Эта функция Azure получает все соединители БД в POST и работающие. Ошибка возникает в строке ExecuteNextAsync.

[FunctionName("DoesCosmosContain")]
    public static async Task<bool> DoesCosmosContain([HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)]HttpRequestMessage req, TraceWriter log)
    {
        try
        {
            MyCosmosInformation scaleParams = await MyCosmosInformation.CreateAsync(req);

            // shimming out locals
            string key = scaleParams.CosmosKey;
            string uri = scaleParams.CosmosUri;
            Uri cosmosUri = new Uri(uri);
            string offerLink = scaleParams.OfferLink;

            using (DocumentClient client = new DocumentClient(cosmosUri, key))
            {
                IDocumentQuery<PhoneNumber> query = client.CreateDocumentQuery<PhoneNumber>(offerLink)
                .Where(p => p.AreaCode=="555" && p.Number=="5551234")
                .AsDocumentQuery();

                while (query.HasMoreResults)
                {
                    foreach (PhoneNumber result in await query.ExecuteNextAsync())
                    {
                        return true;
                    }
                }

                return false;
            }
        }
        catch (Exception e)
        {
            string error = $"DoesCosmosContain failed: {e.Message}";
            log.Error(error);
        }
            return true;
    }

Это класс-оболочка, который помогает анализировать POST JSON для создания соединения с БД.

// Wrapper Class for Post Json data
public class MyCosmosInformation
{
    public async static Task<MyCosmosInformation> CreateAsync(HttpRequestMessage req)
    {
        string data = await req.Content.ReadAsStringAsync();
        MyCosmosInformation returnValue = JsonConvert.DeserializeObject<MyCosmosInformation>(data);

        if (returnValue == null)
        {
            throw new ArgumentNullException("Unable to correctly parse post body into MyCosmosInformation");
        }

        return returnValue;
    }

    public int Throughput { get; set; }
    public string OfferLink { get; set; }
    public string CosmosUri { get; set; }
    public string CosmosKey { get; set; }
    public string CosmosDbId { get; set; }
    public string CosmosCollectionId { get; set; }
}

Это опубликованный JSON. Я подвергся цензуре за мои секреты.

{
"CosmosCollectionId" : "myCollectionId",
"CosmosUri": "https://myEndpoint.documents.azure.com:443",  
"CosmosKey": "MyCosmosKey8eXXXbkrYVSENSOREDgy8eeOMITTED==",
"CosmosDbId": "myDBId",
"OfferLink": "offers/MYID/",
}

PhoneNumberClass

internal sealed class PhoneNumber
{
    [JsonProperty(PropertyName = "Prop_0")]
    public string AreaCode { get; set; }

    [JsonProperty(PropertyName = "Prop_1")]
    public string Number { get; set; }

    public string ResourceId { get; set; }
}

person Frank Sposaro    schedule 19.07.2019    source источник
comment
Можете ли вы также показать нам, что MyCosmosInformation и какие ценности вы публикуете?   -  person Nick Chapsas    schedule 19.07.2019
comment
Я обновил вопрос, чтобы получить эту информацию.   -  person Frank Sposaro    schedule 19.07.2019
comment
Не могли бы вы преобразовать этот query.ExecuteNextAsync() в этот query.ExecuteNextAsync<Document>() и посмотреть, как выглядит настоящий документ. Я подозреваю, что это значение нельзя десериализовать.   -  person Nick Chapsas    schedule 19.07.2019


Ответы (1)


Это недействительно: client.CreateDocumentQuery<PhoneNumber>(offerLink)

Вы используете ссылку предложения, которая выглядит так offers/MYID/, однако метод CreateDocumentQuery ожидает collectionLink, а не offerLink.

На основе уже имеющихся значений вы можете построить colletionLink следующим образом:

var collectionLink = UriFactory.CreateDocumentCollectionUri(scaleParams.CosmosDbId, scaleParams.CosmosCollectionId)
person Nick Chapsas    schedule 19.07.2019
comment
Да! Большое спасибо, Ник. Я подтвердил, что мой запрос исправлен. - person Frank Sposaro; 19.07.2019