【问题标题】:Azure HTTP function trigger 2.x with Cosmos DB Output local dev host failing带有 Cosmos DB 输出本地开发主机失败的 Azure HTTP 函数触发器 2.x
【发布时间】:2018-09-01 13:37:28
【问题描述】:

我正在使用 azure functions 2.x 和 dotnet core 开发一个 http 触发器,在最新更新到 VS 2017 15.8.2 后,我在本地运行该函数时收到以下错误

1/9/2018 13:30:50] Stopping Host
[1/9/2018 13:31:06] Reading host configuration file 'C:\Users\MattDouhan\source\repos\NWMposTransInput\NWMposTransInput\bin\Debug\netstandard2.0\host.json'
[1/9/2018 13:31:06] Host configuration file read:
[1/9/2018 13:31:06] {}
[1/9/2018 13:31:06] Starting Host (HostId=desktop7cks1do-260439321, InstanceId=5fd41a43-b3ca-47e4-adf6-320d40fa9613, Version=2.0.11960.0, ProcessId=13156, AppDomainId=1, Debug=False, ConsecutiveErrors=5, StartupCount=6, FunctionsExtensionVersion=)
[1/9/2018 13:31:07] A ScriptHost error has occurred
[1/9/2018 13:31:07] System.Private.CoreLib: Could not load type 'Microsoft.Azure.WebJobs.Hosting.IWebJobsStartup' from assembly 'Microsoft.Azure.WebJobs.Host, Version=3.0.0.0, Culture=neutral, PublicKeyToken=null'.
[1/9/2018 13:31:07] Stopping Host

我正在运行 Function Core 工具 2.0.1-Beta.35 和运行时版本 2.0.11960.0

函数如下所示

using System.IO;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Azure.WebJobs.Host;
using Newtonsoft.Json;
using Microsoft.Extensions.Logging;
using System;

namespace NWMposTransInput
{
    public static class Function1
    {
        [FunctionName("Function1")]
        public static IActionResult Run([HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)]
        HttpRequest req, ILogger log,
            [CosmosDB(
            databaseName: "xxxx",
            collectionName: "yyyy",
            ConnectionStringSetting = "CosmosDbConnection")]out dynamic document,
            ILogger log2)
        {
            log.LogInformation("C# HTTP trigger function processed a request.");

            string name = req.Query["name"];

            string requestBody = new StreamReader(req.Body).ReadToEnd();
            dynamic data = JsonConvert.DeserializeObject(requestBody);
            name = name ?? data?.name;

            document = new { SSourceSystem = "jongelSystem",
                             id = Guid.NewGuid(),
                             SSourceSystemVersion = "1.1",
                             STransactionId = "12345"};

            log.LogInformation($"C# Queue trigger function inserted one row");
            log.LogInformation($"Description={req.Body}");

            return name != null
                ? (ActionResult)new OkObjectResult($"Hello, {name}")
                : new BadRequestObjectResult("Please pass a name on the query string or in the request body");
        }
    }

    public class NWCloudOrder
    {
        public string Id { get; set; }
        public string SSourceSystem { get; set; }
        public string SSourceSystemVersion { get; set; }
        public string STransactionId { get; set; }
    }
}

--- 编辑 --- 确保我使用正确的运行时现在会产生以下错误

[2/9/2018 05:44:15] A ScriptHost error has occurred
[2/9/2018 05:44:15] System.Private.CoreLib: Could not load file or assembly 'Microsoft.AspNetCore.Mvc.Abstractions, Version=2.2.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'. Could not find or load a specific file. (Exception from HRESULT: 0x80131621). System.Private.CoreLib: Could not load file or assembly 'Microsoft.AspNetCore.Mvc.Abstractions, Version=2.2.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'.
[2/9/2018 05:44:15] Stopping Host

我确实安装了 2.2.0-preview1-35029

【问题讨论】:

  • 请编辑您的问题以包含您的 Azure 函数的详细信息。没有代码,只有一些错误日志语句,很难猜测会发生什么。另外,您将此标记为azure-cosmosdb - 这是否相关?请在编辑时说明。
  • 按要求澄清

标签: azure azure-functions azure-cosmosdb azure-functions-runtime azure-functions-core-tools


【解决方案1】:

这是由于在旧函数运行时2.0.11960.0 中引用了最新版本3.0.1-beta1/2Microsoft.Azure.WebJobs.Extensions.CosmosDB 引起的。 Microsoft.NET.Sdk.Functions 1.0.19Microsoft.Azure.WebJobs.Extensions.CosmosDB 3.0.1-beta2 取决于运行时 2.0.12050.0

检查此issue 以及相关错误信息,以了解最新运行时2.0.12050.0 的重大更改。

如果您暂时不想迁移到最新的运行时,请将Microsoft.Azure.WebJobs.Extensions.CosmosDB 降级为3.0.0-beta7Microsoft.NET.Sdk.Functions 降级为1.0.14

否则,只需确保 VS 使用最新的函数运行时 2.0.12050.0

  1. 在 VS 菜单-> 扩展和更新上。查找 Azure Functions 和 Web 作业工具。确保它 >= 15.8.5023。(需要先将 VS 更新到 15.8)。

  2. 删除旧的 Function Core tools(Cli) 文件夹%localappdata%\AzureFunctionsTools

  3. 重启 VS 并创建一个新的 Azure 函数。在创建对话框中等待 VS 下载新的 Cli 和模板,直到我们看到提示更改为 Updates are ready。

更新

  1. 检查 Cli 输出,恐怕旧版本 2.0.11651.0 正在使用中。

    Starting Host (HostId=xxx, InstanceId=xxx, Version=2.0.11651.0, ...)
    

    转到%localappdata%\AzureFunctionsTools\Releases,您可能还会看到一个空文件夹2.5.1

    由于网络等原因,下载失败。再次重复上述步骤。如果不起作用,请尝试手动下载 Cli。先关闭VS。

    1)。打开%localappdata%\AzureFunctionsTools\feed.json找到最新的v2下载地址。

    例如cli:https://functionscdn.azureedge.net/public/2.0.1-beta.36/Azure.Functions.Cli.win-x86.2.0.1-beta.36.zip.

    2)。将解压后的文件夹重命名为cli,放到2.5.1下。

    3)。将cli文件夹中的templates文件夹移动到2.5.1

    4)。在 2.5.1 下创建 manifest.json。(更改您的用户名)

    {
     "ReleaseName": "2.5.1",
     "CliEntrypointPath": "C:\\Users\\UserName\\AppData\\Local\\AzureFunctionsTools\\Releases\\2.5.1\\cli\\func.exe",
     "TemplatesDirectory": "C:\\Users\\UserName\\AppData\\Local\\AzureFunctionsTools\\Releases\\2.5.1\\templates",
     "FunctionsExtensionVersion": "~2",
     "SdkPackageVersion": "1.0.19"
    }
    
  2. 函数 SDK 在设计上引用 Microsoft.AspNetCore.Mvc.Abstractions 2.1.0。删除2.2.0-preview1-35029 否则执行时可能会出错。

    Microsoft.Azure.WebJobs.Host: Exception binding parameter 'req'. System.Private.CoreLib: Cannot create an abstract class.
    

【讨论】:

  • 这会产生一个单独的错误,我已经编辑了我的问题以添加当前问题
  • 工作就像一个魅力,需要注意的一点是模板无法在没有 VpN 的情况下在中国下载,这就是我更新失败的原因
  • @MattDouhan 是的,这一直很痛苦,即使使用 VPN,我有时也无法下载它。你能接受我的回答来结束这个问题吗?
猜你喜欢
  • 2023-01-31
  • 2018-07-15
  • 1970-01-01
  • 2020-05-14
  • 1970-01-01
  • 2022-06-23
  • 2019-01-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多