Azure Functions .NET Core 3.1:部署时引用解决方案中的文件失败

Azure Functions .NET Core 3.1: Referencing file in solution failing when deployed

我的 Azure Function (.NET Core 3.1) 解决方案中有一个证书文件,它位于我的解决方案中的这个位置: C:\Users\me\Documents\Code\Test\TestSolution\Test.Subproject\Certificates\cert.p12

文件设置为 Copy if newer,构建操作为 Content

我在我的代码中引用了这样的文件:

_client.Certificates.Add(new Certificate("Certificates/cert.p12", "ssl_094243"));

它在 Azure Function Emulator 中运行良好,但是当部署到 Azure 时它找不到该文件。在我的发布输出中,文件夹结构有些扁平化,所以现在文件位于:

C:\Users\me\Downloads\Test.Functions.zip\Content\D_C\a\s\Test\Test.Functions\obj\Release\netcoreapp3.1\PubTmp\Out\Certificates\cert.p12

如何在我的代码中引用这个文件?我想我需要申请途径。我尝试了下面的代码,但不幸的是它没有用。

_client.Certificates.Add(new Certificate(Path.Combine(Environment.CurrentDirectory, "Certificates/cert.p12"), "ssl_094243"));

正如DavidG所说,更安全的引用证书的方法是using Azure key vault

像你说的那样直接使用也是可以实现的。不确定您使用的部署方法,使用 Visual studio,单击证书文件,您可以看到如下属性设置,选择 Copy alwaysCopy if new 选项。

然后查看.csproj文件:

重新部署到Azure应用服务,可以在kudu站点看到文件:

如果无效,右键cert文件,手动部署:

终于可以像在本地一样使用了

在尝试了一些事情之后,我决定将证书从一个子项目移到我正在构建和发布的项目中。然后我使用这段代码找出:

string directoryName = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
string certLocation = Path.GetFullPath(Path.Combine(directoryName, "..", "Certificates/cert.p12"));
            _client.Certificates.Add(new Certificate(certLocation, "password"));

我发现,如果我把证书文件夹和文件放在子项目里,在Debug里会复制到bin文件夹下,发布时会保存到根文件夹里,很奇怪。将文件夹移动到我正在构建的项目意味着证书总是输出到相同的位置。我想知道这是不是一个错误?