ServiceStack Redis不在AWS Lambda上运行

时间:2017-09-25 14:06:44

标签: amazon-web-services servicestack aws-lambda servicestack.redis servicestack-text

我正在尝试使用ServiceStack .Redis.Core库(版本1.0.44)从我的Lambda函数中利用AWS Elasticache(Redis)。从我的本地机器(mac osx)运行lambda时一切正常;我可以毫无错误地与AWS Redis缓存进行交互。

但是,当我将我的功能部署到AWS以在其lambda服务器上执行时,代码不再有效,ServiceStack.Text.Env库会抛出PlatformNotSupportedException异常:

{
  "errorType": "RedisException",
  "errorMessage": "[13:50:14.793] Unable to Connect: sPort: 55382, Error: The type initializer for 'ServiceStack.Text.Env' threw an exception.
   at ServiceStack.Redis.RedisNativeClient.FlushSendBuffer()
   at ServiceStack.Redis.RedisNativeClient.SendReceive[T](Byte[][] cmdWithBinaryArgs, Func`1 fn, Action`1 completePipelineFn, Boolean sendWithoutRead)",
  "stackTrace": [
    "at ServiceStack.Redis.RedisNativeClient.CreateConnectionError(Exception originalEx)",
    "at ServiceStack.Redis.RedisNativeClient.SendReceive[T](Byte[][] cmdWithBinaryArgs, Func`1 fn, Action`1 completePipelineFn, Boolean sendWithoutRead)",
    "at ServiceStack.Redis.RedisNativeClient.get_Info()",
    "at ServiceStack.Redis.RedisClient.GetServerRole()",
    "at ServiceStack.Redis.RedisResolver.CreateRedisClient(RedisEndpoint config, Boolean master)",
    "at ServiceStack.Redis.RedisManagerPool.GetClient()",
    **snip**
    "at lambda_method(Closure , Stream , Stream , ContextInfo )"
  ],
  "cause":   {
    "errorType": "TypeInitializationException",
    "errorMessage": "The type initializer for 'ServiceStack.Text.Env' threw an exception.",
    "stackTrace": [
      "at ServiceStack.Redis.RedisNativeClient.FlushSendBuffer()",
      "at ServiceStack.Redis.RedisNativeClient.SendReceive[T](Byte[][] cmdWithBinaryArgs, Func`1 fn, Action`1 completePipelineFn, Boolean sendWithoutRead)"
    ],
    "cause":     {
      "errorType": "PlatformNotSupportedException",
      "errorMessage": "Operation is not supported on this platform.",
      "stackTrace": [
        "at System.Runtime.InteropServices.OSPlatform.get_Linux()",
        "at ServiceStack.Text.Env..cctor()"
      ]
    }
  }
}  

在AWS Lambda中运行时,是否可以使用ServiceStack.Redis.Core包?

1 个答案:

答案 0 :(得分:3)

此异常是由于AWS Lambda没有实现.NET Core的RuntimeInformation.IsOSPlatform(OSPlatform.Linux) API来检测正在运行App的操作系统。

我只是added a fix to catch这个未实现的API,可以从v4.5.15获得,现在是available on MyGet