如何使用 C# 在 Lambda 中存储和访问文件 我使用了可用于 lambda 的 tmp 文件夹,但出现无法加载文件或程序集的错误。如何解决错误?我使用了 ADP nuget。
using (WebClient webClient = new WebClient())
{
webClient.DownloadFile(reportLine, Path.GetTempPath() +
"sample_auth.key");
}
我用它来将文件下载到 lambda 的 tmp 文件夹中。我没有在字符串机密中包含其他配置,但您可以查看下面的 github 以获取完全相同的示例。
string config = @"{
""sslCertPath"": ""/tmp/sample.pfx"",
""sslKeyPath"": ""/tmp/sample_auth.key"",
}";
ADPAccessToken token = null;
if (String.IsNullOrEmpty(clientconfig))
{
Console.WriteLine("Settings file or default options not available.");
}
else
{
ClientCredentialConfiguration connectionCfg = JSONUtil.Deserialize<ClientCredentialConfiguration>(clientconfig);
ClientCredentialConnection connection = (ClientCredentialConnection)ADPApiConnectionFactory.createConnection(connectionCfg);
//context.Logger.Log(ADPApiConnection.certificatepath);
//context.Logger.Log(clientconfig);
try
{
connection.connect();
if (connection.isConnectedIndicator())
{
token = connection.accessToken;
// context.Logger.Log("Connected to API end point");
// //Console.WriteLine("Token: ");
// //Console.WriteLine(" AccessToken: {0} ", token.AccessToken);
// //Console.WriteLine(" TokenType: {0} ", token.TokenType);
// //Console.WriteLine(" ExpiresIn: {0} ", token.ExpiresIn);
// //Console.WriteLine(" Scope: {0} ", token.Scope);
// //Console.WriteLine(" ExpiresOn: {0} ", token.ExpiresOn);
// //Console.ReadLine();
}
}
catch (ADPConnectionException e)
{
context.Logger.Log(e.Message);
}
//catch (Exception e)
//{
// context.Logger.Log(e.Message);
//}
//Console.Read();
}
return "Ok";
}
我收到一个错误,我认为 lambda 检查/var/task 文件夹
errorMessage": "One or more errors occurred. (Could not load file or
assembly 'System.Net.Http.WebRequest, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b03f5f7f11d50a3a'. The system cannot find the file
specified.n)",
"cause": {
"errorType": "FileNotFoundException",
"errorMessage": "Could not load file or assembly
'System.Net.Http.WebRequest, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b03f5f7f11d50a3a'. The system cannot find the file
specified.n",
下面是示例程序: https://github.com/adplabs/adp-connection-NET/blob/master/ADPClientDemo/Program.cs
我可以在控制台上运行该程序,但是当我尝试在lambda中执行此操作时,出现错误。是因为来自 AWS 的 NuGet 吗?
我有以下 NuGet
Amazon Lambda Core
Amazon Lambda S3 Events
Amazon lambda Serialization json
AWS SDK Core
Microsoft Asp Net Web Api Client
ADP library connection NET
无法加载文件或程序集:System.Net.Http.WebRequest
该错误似乎是由版本控制问题引起的,我认为您需要使用System.Net.Http.WebRequest
dll 的 .Net 核心版本或比 .Net 4.0 更高的版本才能与 .NET Core 2.0 一起使用。
实际上,请看这个答案,您可能会不走运:您使用的库需要面向.NET Core:https://github.com/dotnet/corefx/issues/28267#issuecomment-396349873
另请参阅 https://stackoverflow.com/a/41683787/495455 和无法加载 .NET AWSSDK 中的文件或程序集"System.Net.Http.Webrequest",了解类似的版本控制问题和修复。
如果这不能解决问题,请考虑使用 AWS API。您可以将 sample_auth.key 文件放在 S3 存储桶上并读取它,例如 https://docs.aws.amazon.com/lambda/latest/dg/with-s3.html
或者根据您链接到的示例,他们将 json 文件与 Lambda 打包: https://github.com/adplabs/adp-connection-NET/tree/master/ADPClientDemo/Content/config
他们使用StreamReader
读取它,也许这会使用System.IO
dll 而不是尝试查找System.Net.Http.WebRequest
dll:
string configFileName = "default.json";
StreamReader sr = new StreamReader("..\..\Content\config\" + configFileName);
string clientconfig = sr.ReadToEnd();