在 Azure Functions 上使用 Box SDK 时出错

Posted

技术标签:

【中文标题】在 Azure Functions 上使用 Box SDK 时出错【英文标题】:Error using Box SDK on Azure Functions 【发布时间】:2017-03-27 12:04:34 【问题描述】:

我收到 “无法加载文件或程序集 'Box.V2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ddda8fe64dde1ac3' 或其依赖项之一。系统找不到指定的文件” Azure Functions 中的 错误。关于问题可能是什么的任何想法?

我正在使用 package.json 文件让 Azure Functions 提取引用并按照文档中的说明将它们全部连接起来。

当您上传 project.json 文件时,运行时会获取包并自动添加对包程序集的引用。您不需要添加 #r "AssemblyName" 指令。只需将所需的 using 语句添加到 run.csx 文件即可使用 NuGet 包中定义的类型。

https://docs.microsoft.com/en-us/azure/azure-functions/functions-reference-csharp

我的 package.json 文件:


  "frameworks": 
    "net46":
      "dependencies": 
        "BouncyCastle": "1.8.1",
        "BouncyCastle-PCL": "1.0.0.6",
        "Box.V2": "2.14.0",
        "Box.V2.JWTAuth": "1.2.0",
        "Microsoft.Bcl": "1.1.10",
        "Microsoft.Bcl.Async": "1.0.168",
        "Microsoft.Bcl.Build": "1.0.14",
        "Microsoft.Net.Http": "2.2.29",
        "Newtonsoft.Json": "6.0.2",
        "Nito.AsyncEx": "2.1.3",
        "System.IdentityModel.Tokens.Jwt": "4.0.2.206221351"
      
    
  

run.csx using 语句:

using global::Box.V2;
using global::Box.V2.Config;
using global::Box.V2.Exceptions;
using global::Box.V2.JWTAuth;
using global::Box.V2.Models;

完全例外:

Microsoft.Azure.WebJobs.Host.FunctionInvocationException : Exception while executing function: Functions.GetTelogisFormInstancePdf ---> System.Reflection.TargetInvocationException : Exception has been thrown by the target of an invocation. ---> System.IO.FileNotFoundException : Could not load file or assembly 'Box.V2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ddda8fe64dde1ac3' or one of its dependencies. The system cannot find the file specified.

   at Submission#0.Run(HttpRequestMessage req,TraceWriter log) at  : 84 

   End of inner exception

   at System.RuntimeMethodHandle.InvokeMethod(Object target,Object[] arguments,Signature sig,Boolean constructor)

   at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj,Object[] parameters,Object[] arguments)

   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj,BindingFlags invokeAttr,Binder binder,Object[] parameters,CultureInfo culture)

   at async Microsoft.Azure.WebJobs.Script.Description.DotNetFunctionInvoker.InvokeCore(Object[] parameters,FunctionInvocationContext context)

   at async Microsoft.Azure.WebJobs.Script.Description.FunctionInvokerBase.Invoke(Object[] parameters)

   at async Microsoft.Azure.WebJobs.Host.Executors.FunctionInvoker`1.InvokeAsync[TReflected](Object[] arguments)

   at async Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.InvokeAsync(IFunctionInvoker invoker,Object[] invokeParameters,CancellationTokenSource timeoutTokenSource,CancellationTokenSource functionCancellationTokenSource,Boolean throwOnTimeout,TimeSpan timerInterval,IFunctionInstance instance)

   at async Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.ExecuteWithWatchersAsync(IFunctionInstance instance,IReadOnlyDictionary`2 parameters,TraceWriter traceWriter,CancellationTokenSource functionCancellationTokenSource)

   at async Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.ExecuteWithLoggingAsync(??…

【问题讨论】:

看起来像是版本不匹配的标志。是否可以从不同版本的不同包中引用两次相同的依赖项? 【参考方案1】:

错误清楚地表明它找不到程序集:

System.IO.FileNotFoundException : Could not load file or assembly 'Box.V2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ddda8fe64dde1ac3' or one of its dependencies. The system cannot find the file specified.

当你在你的 .csx 中显示你有 using 语句来包含命名空间时,你没有在哪里显示你实际上是 reference the external assemblies

如上述链接文档中所述:

If you need to reference a private assembly, you can upload the assembly file into a bin folder relative to your function and reference it by using the file name (e.g. #r "MyAssembly.dll").

确保路径正确;我必须确保bin 文件夹位于函数所在的路径中——共享汇编方法对我不起作用。

我还建议,也许比处理 csx 和引用程序集更简单的方法是将 csx 全部抛弃并使用blog post 中描述的预编译函数。然后,您将获得程序集的完整编译时间分辨率和正确的智能感知,而这是 CSX 文件所没有的。

【讨论】:

【参考方案2】:

这个错误具有误导性,我不得不最终覆盖 BoxJWTAuth 以使其正常工作。这个错误的详细信息可以在这里找到:https://github.com/box/box-windows-sdk-v2/issues/297

【讨论】:

看来您找到了解决方案。我会等到 Box 解决它。我暂时将其标记为答案。

以上是关于在 Azure Functions 上使用 Box SDK 时出错的主要内容,如果未能解决你的问题,请参考以下文章

在 Azure Functions 上使用 AdWords API

在 LocalHost 上使用 Azure Functions 配置身份验证

使用 Azure Functions Core Tools 在本地运行 Azure 函数时出现问题

Azure 函数 - 'azure-functions-host' 文件夹的位置

使用“apollo-server-azure-functions”的 Apollo 订阅

身份验证如何在 Azure Functions 上工作