Newtonsoft.Json引用抱怨Azurefunction
我正在运行一个名为SmsWebhook
的Azure Functions。 它调用外部程序AzureFunctionsSample.Services.dll
的方法AzureFunctionsSample.Services.dll
,该方法引用了Newtonsoft.Json 8.0.3
我的Run.csx
的详细信息如下:
#r "AzureFunctionsSample.Services.dll" using System.Net; using AzureFunctionsSample.Services public static async Task Run(HttpRequestMessage req, TraceWriter log) { ... }
在上面的Run()
方法中,我创建了一个实例并在实例中调用了一个方法。 但是,每当我调用该方法时,都会收到以下错误:
2016-05-19T13:41:45 Welcome, you are now connected to log-streaming service. 2016-05-19T13:41:46.878 Function started (Id=64fccf0c-d0ef-45ef-ac1c-7736adc94566) 2016-05-19T13:41:46.878 C# HTTP trigger function processed a request. RequestUri=https://ase-dev-fn-demo.azurewebsites.net/api/smswebhook 2016-05-19T13:41:46.878 Function completed (Failure, Id=64fccf0c-d0ef-45ef-ac1c-7736adc94566) 2016-05-19T13:41:46.894 Exception while executing function: Functions.SmsWebhook. Microsoft.Azure.WebJobs.Script: One or more errors occurred. AzureFunctionsSample.Services: Could not load file or assembly 'Newtonsoft.Json, Version=8.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040).
我在bin
目录下手动添加了相同版本的Newtonsoft.Json.dll
,但仍然遇到了同样的错误。 为什么在Newtonsoft.Json.dll
文件中抱怨?
如果我将外部程序集中的所有逻辑移动到Run.csx
, Run.csx
,它不会抱怨。
@JustInChronicles,我在这里添加这个作为参考的答案,但预期的行为应该是从bin
文件夹中解析私有程序集的间接依赖关系,如预期的那样。
我将以下测试放在一起以重现您的场景:
- 创建了一个简单类的简单类库,它使用Json.NET序列化对象并返回JSON字符串。 该程序集引用了Json.NET 8.0.3。 结果包括它正在使用的Json.NET程序集版本
- 创建了一个仅使用
#r "DependencyWithJsonRef.dll"
引用该类型的函数,并返回上述方法生成的结果 - 将
DependencyWithJsonRef.dll
和Newtonsoft.Json.dll
(8.0.3)部署到我的函数的bin
文件夹
调用该函数会产生预期的结果。
这是函数,供参考:
#r "DependencyWithJsonRef.dll" using System.Net; public static string Run(HttpRequestMessage req, TraceWriter log) { var myType = new DependencyWithJsonRef.TestType(); return myType.GetFromJson(); }
如您所见,不需要明确引用间接依赖(Json.NET)。
这是我得到的输出:
{ "Prop1":"Test", "Prop2":1, "AssemblyName": "Newtonsoft.Json, Version=8.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed" }
快速说明:您可能想要检查的一件事情,特别是如果您在开发函数时更新了该依赖项,那么组件结果结果不会被缓存。 确保你从一个干净的平板开始的一个可靠的方法是(在部署你的函数和程序集之后)去Kudu并杀死非scm w3wp进程以查看是否有帮助。 我很想知道这是否有效,因为如果有的话,我们可以采取一些措施来改善这一点。
Json.Net可以简单地引用在Run.csx
文件的顶部添加这一行:
#r "Newtonsoft.Json"
如果您想知道Azure Functions托管环境自动添加哪些程序集,请参阅此文章:
- Azure Functions C#开发人员参考
否则,如果你想使用特定版本的Json.Net,你应该使用nuget包添加对Json.Net的引用:
- 如何在Azurefunction中使用NuGet包?
所以你需要添加一个如下所示的Project.json文件:
{ "frameworks": { "net46":{ "dependencies": { "Newtonsoft.Json": "8.0.3" } } } }
如果您的外部依赖项在不使用nuget包的情况下引用了Newtonsoft.Json
,那么您可以查看这篇文章,其中介绍了如何上传二进制文件:
- 如何将外部程序集与Microsoft Azurefunction应用程序一起使用?
经过一些反复试验的方法。 我发现这里的问题是什么。
@FabioCavalcante使用基于文件的引用给了我一个提示,
#r "Newtonsoft.Json.dll"
它实际上没有用。 我已将这四个文件复制到Azure Functions的bin
目录:
-
AzureFunctionsSample.Services.dll
-
AzureFunctionsSample.Services.pdb
-
Newtonsoft.Json.dll
-
Newtonsoft.Json.xml
它仍然给了我同样的错误,即使我做了基于文件的引用。 然后,我找到了另一个文件AzureFunctionsSample.Services.dll.config
,它实际上定义了程序集绑定重定向,如:
将此配置文件复制到Azure Functions的bin
目录后,它工作正常!
得到教训
- 如果您的外部程序集也有对它的引用,请使用
Newtonsoft.Json
,##r "Newtonsoft.Json.dll"
的基于文件的引用。 - 确保Azure Functions的
bin
目录中存在程序集绑定重定向配置。
纠正我,如果我还是错的话。
干杯,
- 由Microsoft.NET.Sdk.Functions引起的版本冲突
- 如何设置function应用程序以从媒体类型’application / x-www-form-urlencoded’中提取数据
- 在Visual Studio中调试x64 Azurefunction
- 如何在HTTPS上的Visual Studio中本地运行Azurefunction?
- 无法将参数’log’绑定到类型TraceWriter
- 在Azure Function中运行.exe可执行文件
- 如何添加对Azure Function C#项目的引用?
- 使用Azurefunction损坏已resize的图像
- Azure函数使用TraceWriter在外部库中进行日志记录