blob: 3ac75beac5fdf715cc1fd5385978d2e7a477cc0c [file] [log] [blame] [view]
<!--
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
-->
## Creating and invoking .NET Core actions
The following sections guide you through creating and invoking a single .NET Core action.
In order to compile, test and archive .NET Core projects, you must have the [.NET Core SDK](https://www.microsoft.com/net/download) installed locally and the environment variable `DOTNET_HOME` set to the location where the `dotnet` executable can be found.
A .NET Core action is a .NET Core class library with a method called `Main` that has the exact signature as follows:
```csharp
public Newtonsoft.Json.Linq.JObject Main(Newtonsoft.Json.Linq.JObject);
```
For example, create a C# project called `Apache.OpenWhisk.Example.Dotnet`:
```bash
dotnet new classlib -n Apache.OpenWhisk.Example.Dotnet -lang "C#"
cd Apache.OpenWhisk.Example.Dotnet
```
Install the [Newtonsoft.Json](https://www.newtonsoft.com/json) NuGet package as follows:
```bash
dotnet add package Newtonsoft.Json -v 12.0.1
```
Now create a file called `Hello.cs` with the following content:
```csharp
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:
```bash
dotnet publish -c Release -o out
```
Zip the published files as follows:
```bash
cd out
zip -r -0 helloDotNet.zip *
```
An action supports not only a JSON object but also a JSON array as a return value.
It would be a simple example that uses an array as a return value:
```csharp
using System;
using Newtonsoft.Json.Linq;
namespace Apache.OpenWhisk.Tests.Dotnet
{
public class HelloArray
{
public JArray Main(JObject args)
{
JArray jarray = new JArray();
jarray.Add("a");
jarray.Add("b");
return (jarray);
}
}
}
```
You can also create a sequence action with actions accepting an array param and returning an array result.
You can easily figure out the parameters with the following example:
```csharp
using System;
using Newtonsoft.Json.Linq;
namespace Apache.OpenWhisk.Tests.Dotnet
{
public class HelloPassArrayParam
{
public JArray Main(JArray args)
{
return (args);
}
}
}
```
### Create the .NET Core Action
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:
```bash
wsk action update helloDotNet helloDotNet.zip --main Apache.OpenWhisk.Example.Dotnet::Apache.OpenWhisk.Example.Dotnet.Hello::Main --kind dotnet:2.2
```
### Invoke the .NET Core Action
Action invocation is the same for .NET Core actions as it is for Swift and JavaScript actions:
```bash
wsk action invoke --result helloDotNet --param name World
```
```json
{
"greeting": "Hello World!"
}
```