Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Azure函数C#:根据HTTP请求在cosmos db中创建或替换文档_C#_Function_Azure_Azure Cosmosdb_Document - Fatal编程技术网

Azure函数C#:根据HTTP请求在cosmos db中创建或替换文档

Azure函数C#:根据HTTP请求在cosmos db中创建或替换文档,c#,function,azure,azure-cosmosdb,document,C#,Function,Azure,Azure Cosmosdb,Document,我正在尝试在C#中构建一个Azure函数,如果id不存在,则使用SQL API在Azure cosmos DB中创建一个新的文档对象,如果文档对象已经存在,则更新它 这背后的上下文是将聊天机器人会话历史记录到唯一的用户会话 输入: 带有参数(id(字符串)、chatHistory(字符串)和chatDateTime(字符串))的HTTP GET请求 输出: 如果已经存在具有相同id的文档对象,则使用输入chatHisotry和chatDateTime更新文档。 如果不存在具有相同id的文档

我正在尝试在C#中构建一个Azure函数,如果id不存在,则使用SQL API在Azure cosmos DB中创建一个新的文档对象,如果文档对象已经存在,则更新它

这背后的上下文是将聊天机器人会话历史记录到唯一的用户会话

输入:
带有参数(id(字符串)、chatHistory(字符串)和chatDateTime(字符串))的HTTP GET请求

输出:
如果已经存在具有相同id的文档对象,则使用输入chatHisotry和chatDateTime更新文档。

如果不存在具有相同id的文档对象,则创建id、chatHistory和chatDateTime等于input的新文档对象

非常感谢任何帮助!这件事已经纠缠了好几天了

文档对象的示例:

{
    "id": "ESCRfAKwlTbH8W5aVRLxgA",
    "chatHistory": "Hi, Hello",
    "chatDateTime": "Fri Sep 21 2018 05:34:35 GMT+0000 (Coordinated Universal Time)",
    "_rid": "RwYSAIqaSVg2AAAAAAAAAA==",
    "_self": "dbs/RwYSAA==/colls/RwYSAIqaSVg=/docs/RwYSAIqaSVg2AAAAAAAAAA==/",
    "_etag": "\"00007400-0000-0000-0000-5ba482ed0000\"",
    "_attachments": "attachments/",
    "_ts": 1537508077
}

下面是一个如何做到这一点的示例。你只需要调整它以适应你的需要

    [FunctionName("Function1")]
    public static async Task<HttpResponseMessage> Run(
    [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)]HttpRequestMessage req,
    TraceWriter log)
    {
        dynamic data = await req.Content.ReadAsAsync<object>();

        var connectionString = "DbUri";
        var key = "DbKey";

        using (var client = new DocumentClient(new Uri(connectionString), key))
        {
            var collectionLink = UriFactory.CreateDocumentCollectionUri("DbName", "CollectionName");
            await client.UpsertDocumentAsync(collectionLink, data);
        }

        return req.CreateResponse(HttpStatusCode.OK);
    }
[FunctionName(“Function1”)]
公共静态异步任务运行(
[HttpTrigger(AuthorizationLevel.Function,“get”,“post”,Route=null)]HttpRequestMessage请求,
TraceWriter日志)
{
动态数据=wait req.Content.ReadAsAsync();
var connectionString=“DbUri”;
var key=“DbKey”;
使用(var client=newdocumentclient(新Uri(connectionString),key))
{
var collectionLink=UriFactory.CreateDocumentCollectionUri(“DbName”、“CollectionName”);
等待客户端。上传文档同步(收集链接、数据);
}
返回请求CreateResponse(HttpStatusCode.OK);
}

您可以使用Azure功能。输出绑定执行向上插入操作

[FunctionName("HttpTriggerWithSingleDocument")]
    public static async Task<HttpResponseMessage> Run(
        [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)]HttpRequestMessage req,
        [DocumentDB(databaseName: "your-db",
            collectionName: "your-collection",
            ConnectionStringSetting = "CosmosDBConnectionString")] out dynamic documentToSave)
    {
        dynamic data = await req.Content.ReadAsAsync<object>();

        if (data == null)
        {
            documentToSave = null;
            return req.CreateResponse(HttpStatusCode.BadRequest);
        }

        documentToSave = data;

        return req.CreateResponse(HttpStatusCode.Created);
}

此处提供更多示例:

您正在direct azure portal或Visual Studio中开发此功能。您能告诉我们您到目前为止都做了些什么吗?你尝试了什么,你在挣扎什么?嗨!我是在direct Azure门户网站上开发的。@nickchapsa我一直在搞乱下面这个(我在网上找到的随机教程),它允许我将文档插入cosmos文档数据库。但是没有运气将条件逻辑构建到it@NickChapsas我已经成功构建了一个函数,在http get请求时将数据输入cosmos文档数据库,但是如果文档对象已经存在,我很难让函数替换/升级(?)数据,因此不建议在函数代码中创建DocumentClient,这可能会导致插座耗尽,看到好点就知道了。我忘了。这也取决于应用程序计划。但是在这个链接中有一个很好的例子,如何使用DocumentClient,所以将它添加到我的例子中,我们就有了答案。嗨,Matias,我已经将你的代码复制并粘贴到一个名为“HttpTriggerWithSingleDocument”的新azure函数中,并且我已经添加了我的cosmos db作为输出,但是我遇到了这个错误()。我正在azure门户中构建这个。你有什么建议吗?对不起,如果我的问题是非常新手!C#和API构建对我来说仍然是新的。@Michael在使用Azure门户时,语法略有不同。我编辑了我的答案以包含它。谢谢你,马蒂亚斯!这管用!对于其他测试这一点的人,我唯一需要做的更改是添加我的db配置,并将functions.json中的“classes”更改为“req”。
using System.Net;

public static async Task<HttpResponseMessage> Run(
            HttpRequestMessage req,
            IAsyncCollector<dynamic> documentsToStore)
        {
            dynamic data = await req.Content.ReadAsAsync<object>();

            if (data == null)
            {
                return req.CreateResponse(HttpStatusCode.BadRequest);
            }

            await documentsToStore.AddAsync(data);

            return req.CreateResponse(HttpStatusCode.Created);
    }
{
  "bindings": [
    {
      "name": "req",
      "type": "httpTrigger",
      "direction": "in"
    },
    {
      "name": "$return",
      "type": "http",
      "direction": "out"
    },
    {
      "type": "documentDB",
      "name": "documentsToStore",
      "databaseName": "<your-database-name>",
      "collectionName": "<your-collection-name>",
      "createIfNotExists": false,
      "connection": "<your-connection-setting-name>",
      "direction": "out"
    }
  ]
}