我目前正在尝试在aws lambda(C#)下执行http / s请求。
System.Net.Http.HttpClient client = new System.Net.Http.HttpClient();
System.Net.Http.HttpResponseMessage response = await client.GetAsync("URL");
string responseText = response.ToString();
我收到以下错误代码。如果我手动添加dll它仍然无法正常工作。
无法加载DLL' iphlpapi.dll':找不到指定的模块。
是否可以在aws下执行请求?
我的东西:
答案 0 :(得分:5)
我遇到了同样的问题,终于找到了解决方案。实际上,错误告诉您的是Lambda执行环境中不存在iphlpapi.dll程序集。这是从HttpClient调用以处理实际TCPIP请求的系统级程序集。在研究此问题时,我发现AWS Lambda在AWS Linux AMI环境中运行。显然,Windows系统组件将不可用。
深入了解.Net核心,能够针对特定环境定位运行时环境并构建.Net核心。这只是从nuget中提取正确的系统级依赖关系所需要的。
解决方案是在我的project.json中添加一个运行时节点,其中包含一个linux目标。 .Net没有专门针对AWS Linux AMI的目标,因此我只使用了Ubuntu.14.04-64目标,这似乎有效。
"runtimes": {
"ubuntu.14.04-x64": {},
"win10-x64": {}
}
要解决的另一个障碍是VS似乎不允许我为ubuntu运行时编译,所以我不得不放到命令行并使用DotNet CLI。导航到项目目录并发出以下命令:
dotnet恢复 dotnet publish -c release -r ubuntu.14.04-x64
这将获得Ubuntu的所有适当的nuget依赖项,然后为ubuntu构建项目。所有程序集都将放在/bin/release/netcoreapp1.0/ubuntu.14.04-x64/publish目录中。只需压缩这些文件,然后您就可以将此包上传到Lambda函数。
注意:我无法使用AWS工具包功能窗口上传我的文件,因此我不得不求助于从AWS控制台网站上传。
上传新软件包后,一切都按预期工作,我不再收到错误。
答案 1 :(得分:3)
我很好奇你的project.json文件是什么样的?针对.NETCoreApp 1.0.3(Lambda上的C#支持.NETCoreApp 1.0,1.0.3是.NETCoreApp 1.0的LTS版本),我不必指定运行时来发布依赖项。< / p>
这是我的project.json:
{
"version": "1.0.0-*",
"dependencies": {
"Amazon.Lambda.Core": "1.0.0",
"Amazon.Lambda.Serialization.Json": "1.0.1"
},
"frameworks": {
"netcoreapp1.0": {
"dependencies": {
"Microsoft.NETCore.App": {
"type": "platform",
"version": "1.0.1"
}
},
"imports": "dnxcore50"
}
}
}
代码:
using System.Net.Http;
using System.Threading.Tasks;
using Amazon.Lambda.Core;
using Amazon.Lambda.Serialization.Json;
namespace LambdaHttpRequest
{
public class Handler
{
[LambdaSerializer(typeof(JsonSerializer))]
public static async Task<string> MakeRequest()
{
HttpClient client = new HttpClient();
HttpResponseMessage response = await client.GetAsync("https://www.amazon.com/");
return response.ToString();
}
}
}
当我运行dotnet发布(或使用Visual Studio)时,我只看到这些程序集,并且没有特定于平台的程序集的子目录:
我认为问题可能是您定位完整的.NET框架,或者除.NETCoreApp 1.0之外的其他一些版本。