aws lambda c#http / s请求

时间:2017-01-11 11:43:04

标签: c# .net aws-lambda

我目前正在尝试在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下执行请求?

我的东西:

  • Msvc 15
  • Amazon Lambda Core,Amazon Lambda Tools,Amazon Lambda Serialization Json
  • netcore 1.0

2 个答案:

答案 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)时,我只看到这些程序集,并且没有特定于平台的程序集的子目录:

  • LambdaHttpRequest.dll
  • Newtonsoft.Json.dll
  • Amazon.Lambda.Core.dll
  • Amazon.Lambda.Serialization.Json.dll
  • System.Runtime.Serialization.Primitives.dll

我认为问题可能是您定位完整的.NET框架,或者除.NETCoreApp 1.0之外的其他一些版本。