A .NET Core action is a .NET Core class library with a method called Main
that has the exact signature as follows:
public Newtonsoft.Json.Linq.JObject Main(Newtonsoft.Json.Linq.JObject);
In order to compile, test and archive .NET Core projects, you must have the .NET Core SDK installed locally and the environment variable DOTNET_HOME
set to the location where the dotnet
executable can be found.
For example, create a C# project called Apache.OpenWhisk.Example.Dotnet
:
dotnet new classlib -n Apache.OpenWhisk.Example.Dotnet -lang C# -f netstandard2.0 cd Apache.OpenWhisk.Example.Dotnet
Install the Newtonsoft.Json NuGet package as follows:
dotnet add package Newtonsoft.Json -v 12.0.2
Now create a file called Hello.cs
with the following content:
using System; using Newtonsoft.Json.Linq; namespace Apache.OpenWhisk.Example.Dotnet { public class Hello { public JObject Main(JObject args) { string name = "stranger"; if (args.ContainsKey("name")) { name = args["name"].ToString(); } JObject message = new JObject(); message.Add("greeting", new JValue($"Hello, {name}!")); return (message); } } }
Publish the project as follows:
dotnet publish -c Release -o out
Zip the published files as follows:
cd out zip -r -0 helloDotNet.zip *
You need to specify the name of the function handler using --main
argument. The value for main
needs to be in the following format: {Assembly}::{Class Full Name}::{Method}
, e.q., Apache.OpenWhisk.Example.Dotnet::Apache.OpenWhisk.Example.Dotnet.Hello::Main
To use on a deployment of OpenWhisk that contains the runtime as a kind:
wsk action update helloDotNet helloDotNet.zip --main Apache.OpenWhisk.Example.Dotnet::Apache.OpenWhisk.Example.Dotnet.Hello::Main --kind dotnet:2.2
Action invocation is the same for .NET Core actions as it is for Swift and JavaScript actions:
wsk action invoke --result helloDotNet --param name World
{ "greeting": "Hello World!" }
./gradlew core:dotnet2.2:distDocker
This will produce the image whisk/action-dotnet-v2.2
Build and Push image
docker login ./gradlew core:action-dotnet-v2.2:distDocker -PdockerImagePrefix=$prefix-user -PdockerRegistry=docker.io
Deploy OpenWhisk using ansible environment that contains the kind dotnet:2.2
Assuming you have OpenWhisk already deploy localy and OPENWHISK_HOME
pointing to root directory of OpenWhisk core repository.
Set ROOTDIR
to the root directory of this repository.
Redeploy OpenWhisk
cd $OPENWHISK_HOME/ansible ANSIBLE_CMD="ansible-playbook -i ${ROOTDIR}/ansible/environments/local" $ANSIBLE_CMD setup.yml $ANSIBLE_CMD couchdb.yml $ANSIBLE_CMD initdb.yml $ANSIBLE_CMD wipe.yml $ANSIBLE_CMD openwhisk.yml
Or you can use wskdev
and create a soft link to the target ansible environment, for example:
ln -s ${ROOTDIR}/ansible/environments/local ${OPENWHISK_HOME}/ansible/environments/local-dotnet wskdev fresh -t local-dotnet
Install dependencies from the root directory on $OPENWHISK_HOME repository
pushd $OPENWHISK_HOME ./gradlew install podd $OPENWHISK_HOME
Using gradle to run all tests
./gradlew :tests:test
Using gradle to run some tests
./gradlew :tests:test --tests DotNet2_2ActionContainerTests
Using IntelliJ:
To use as docker action push to your own dockerhub account
docker tag whisk/action-dotnet-v2.2 $user_prefix/action-dotnet-v2.2 docker push $user_prefix/action-dotnet-v2.2
Then create the action using your the image from dockerhub
wsk action update helloDotNet helloDotNet.zip --main Apache.OpenWhisk.Example.Dotnet::Apache.OpenWhisk.Example.Dotnet.Hello::Main --docker $user_prefix/action-dotnet-v2.2
The $user_prefix
is usually your dockerhub user id.