问题
I am developing a http trigger using azure functions 2.x and dotnet core, after the latest update to VS 2017 15.8.2 I am getting the following error when running the function locally
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
I am running Function Core tools 2.0.1-Beta.35 and runtime version 2.0.11960.0
The function looks as follows
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; }
}
}
--- EDIT --- Making sure I use the correct runtime this now produces the following error
[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
I do have 2.2.0-preview1-35029 installed
回答1:
It's caused by referencing Microsoft.Azure.WebJobs.Extensions.CosmosDB
of latest version 3.0.1-beta1/2
in old function runtime 2.0.11960.0
. Microsoft.NET.Sdk.Functions 1.0.19
and Microsoft.Azure.WebJobs.Extensions.CosmosDB 3.0.1-beta2
depends on runtime 2.0.12050.0
.
Check this issue with relevant error info for breaking changes of latest runtime 2.0.12050.0
.
If you don't want to move to latest runtime for now, downgrade Microsoft.Azure.WebJobs.Extensions.CosmosDB
to 3.0.0-beta7
and Microsoft.NET.Sdk.Functions
to 1.0.14
.
Else just make sure VS consumes the latest function runtime 2.0.12050.0
.
On VS menus-> Extensions and Updates. Find Azure Functions and Web Jobs Tools. Make sure it's >= 15.8.5023.(Need to update VS to 15.8 first).
Delete old Function Core tools(Cli) folder
%localappdata%\AzureFunctionsTools
.Restart VS and create a new Azure function. Wait at the creation dialog for VS to download new Cli and templates, until we see the tip change to Updates are ready.
Update
Check Cli output, I am afraid older version 2.0.11651.0 is in use.
Starting Host (HostId=xxx, InstanceId=xxx, Version=2.0.11651.0, ...)
Go to
%localappdata%\AzureFunctionsTools\Releases
, you may also see an empty folder2.5.1
.The download failed due to some reason like network. Repeat the steps above again. If it doesn't work, try to download Cli manually. Close VS first.
1). Open
%localappdata%\AzureFunctionsTools\feed.json
to find latest download url of v2.e.g. cli: https://functionscdn.azureedge.net/public/2.0.1-beta.36/Azure.Functions.Cli.win-x86.2.0.1-beta.36.zip.
2). Rename unzipped folder as
cli
, put it under2.5.1
.3). Move
templates
folder incli
folder to2.5.1
.4). Create a manifest.json under
2.5.1
.(Change your UserName){ "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" }
Function SDK references
Microsoft.AspNetCore.Mvc.Abstractions 2.1.0
by design. Remove2.2.0-preview1-35029
or we may get error when executing.Microsoft.Azure.WebJobs.Host: Exception binding parameter 'req'. System.Private.CoreLib: Cannot create an abstract class.
来源:https://stackoverflow.com/questions/52128635/azure-http-function-trigger-2-x-with-cosmos-db-output-local-dev-host-failing