2

Ich versuche, AWS Elasticache (Redis) aus meiner Lambda-Funktion mit der ServiceStack .Redis.Core-Bibliothek (Version 1.0.44) zu nutzen. Wenn das Lambda von meinem lokalen Rechner (Mac OSX) läuft, funktioniert alles gut; Ich kann mit dem AWS Redis-Cache ohne Fehler interagieren.ServiceStack Redis läuft nicht auf AWS Lambda

Allerdings, wenn ich meine Funktion AWS bereitstellen auf ihre Lambda-Server der Code nicht mehr funktioniert und die ServiceStack.Text.Env Bibliothek wirft eine PlatformNotSupportedException Ausnahme auszuführen:

{ 
    "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()" 
     ] 
    } 
    } 
} 

So ist es möglich, zu verwenden, das ServiceStack.Redis.Core-Paket beim Ausführen in AWS Lambda?

+1

Haben Sie Ihre Anwendung auf OSX erstellt und auf Lambda hochgeladen? – dashmug

+0

Ja, es wurde auf meinem Mac mit dem .NET Standard 1.6 Framework erstellt. FWIW alles andere im Lambda funktioniert gut. Nur wenn der Code die Interaktion mit ServiceStack.Redis auslöst, löst er diese Ausnahme aus. – Jez

+0

Lambda läuft unter Linux, also sollten Sie Ihren Code auf einem Linux-Rechner kompilieren und den kompilierten Code auf Lambda hochladen. – dashmug

Antwort

3

Diese Ausnahme ist darauf zurückzuführen, dass AWS Lambda die API RuntimeInformation.IsOSPlatform(OSPlatform.Linux) von .NET Core nicht implementiert, um festzustellen, auf welchem ​​Betriebssystem die App ausgeführt wird.

Ich habe gerade added a fix to catch diese nicht implementierte API, die von v4.5.15 ist das ist jetzt available on MyGet.

+1

Das neue Paket hat super funktioniert! Vielen Dank! – Jez