从Azure触发功能执行Azure存储过程

时间:2019-08-21 07:06:26

标签: azure azure-functions azure-cosmosdb azure-cosmosdb-sqlapi

我编写了一个存储过程,用于根据文档的更新日期从cosmosDB中删除记录。 cosmosDB集合具有大量(例如500个)分区键,因此我必须执行500次存储过程。 我正在尝试通过Azure时间触发功能执行Azure的存储过程。

下面是用天蓝色触发功能编写的代码:

添加了新文件project.json

{
  "frameworks": {
    "net46":{
      "dependencies": {
        "Microsoft.Azure.DocumentDB": "2.0.0"
      }
    }
   }
}

run.csx文件更新如下。

#r "Microsoft.Azure.Documents.Client"

    using System;
    using Microsoft.Azure.Documents;
    using Microsoft.Azure.Documents.Client;

    public static async Task Run(TimerInfo myTimer,  IEnumerable<dynamic> 
    inputDocument, TraceWriter log)
    {
    log.Info($"C# Timer trigger function started at: {DateTime.Now}");

    // Get the date 6 months before from Current Time in IST and convert to Epoch value. 
    TimeZoneInfo INDIAN_ZONE = TimeZoneInfo.FindSystemTimeZoneById("India 
    Standard Time");
    DateTime indianTime =  
    TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow.AddDays(-180), 
    INDIAN_ZONE);


    long epochTime = (long)(indianTime - new DateTime(1970, 1, 
    1)).TotalSeconds;

    DocumentClient client;
    string endpoint = "https://***cosmosdb.documents.azure.com:443/";
    string key = "****";
    client = new DocumentClient(new Uri(endpoint), key);

    foreach (var doc in inputDocument)
        {
            string partKey = doc.NUM;
            StoredProcedureResponse<bool> sprocResponse = await 
    client.ExecuteStoredProcedureAsync<bool>(

   "/dbs/DB_NAME/colls/COLLECTION_NAME/sprocs/STORED PROC_NAME/",new 
    RequestOptions { PartitionKey = new PartitionKey(partKey) });

            log.Info($"Cosmos DB is updated at: {DateTime.Now}");
        }
    }

在编译以上代码时出现以下错误。

2019-08-22T15:30:01.759 [Error] Exception while executing function: Functions.TimerTriggerCSharp1. Microsoft.Azure.WebJobs.Script: One or more errors occurred. Microsoft.Azure.Documents.Client: Failed to deserialize stored procedure response or convert it to type 'System.Boolean': Unexpected character encountered while parsing value: {. Path '', line 1, position 1. Newtonsoft.Json: Unexpected character encountered while parsing value: {. Path '', line 1, position 1.
2019-08-22T15:30:01.822 [Error] Function completed (Failure, Id=02da4d71-8207-4227-9c79-1cc277439c20, Duration=1814ms)

在执行存储过程时,我必须传递日期参数和分区键数组。 我完全陷在这个阶段。该如何解决该问题?

2 个答案:

答案 0 :(得分:1)

该错误消息表示您的Azure函数的脚本代码不正确。

删除函数中的所有privatestatic声明。

private static DocumentClient client;
static string endpoint;
static string key

==>

DocumentClient client;
string endpoint;
string key;

一般建议:不要在Azure门户(在.csx中)中编写函数。帮自己一个忙,并使用适当的IDE(例如VS Code)。

答案 1 :(得分:0)

如果您使用的是Portal,则需要像下面这样在函数顶部插入依赖项:

#r "Microsoft.Azure.Documents.Client"
using Microsoft.Azure.Documents;
using Microsoft.Azure.Documents.Client;

请使用更新的SDK版本1.7.1来自3年前:https://www.nuget.org/packages/Microsoft.Azure.DocumentDB/