Quick .NET Core 3.0 Action

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.1
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

Create the .NET Core Action

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:3.0

Invoke the .NET Core Action

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!"

Local Development

./gradlew core:dotnet3.0:distDocker

This will produce the image whisk/action-dotnet-v3.0

Build and Push image

docker login
./gradlew core:action-dotnet-v3.0:distDocker -PdockerImagePrefix=$prefix-user -PdockerRegistry=docker.io

Deploy OpenWhisk using ansible environment that contains the kind dotnet:3.0 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

./gradlew install

Using gradle to run all tests

./gradlew :tests:test

Using gradle to run some tests

./gradlew :tests:test --tests DotNet3_0ActionContainerTests

Using IntelliJ:

  • Import project as gradle project.
  • Make sure working directory is root of the project/repo

Using Container Image To Test

To use as docker action push to your own dockerhub account

docker tag whisk/action-dotnet-v3.0 $user_prefix/action-dotnet-v3.0
docker push $user_prefix/action-dotnet-v3.0

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-v3.0

The $user_prefix is usually your dockerhub user id.


Apache 2.0