Langages .NET

Il est possible d'écrire une fonction dans différents langages .NET (C#, Visual Basic ou F#). Commune à tous les langages, la tâche de base consiste à créer une classe mettant en œuvre l'une des interfaces du framework des fonctions :

Ce document fournit des exemples pour F# et Visual Basic.

Modèles

Notez que pour exécuter les exemples de ce document, vous utiliserez les modèles :

  1. Installez le SDK .NET.

  2. Installez le package de modèles :

    dotnet new install Google.Cloud.Functions.Templates
    

Des modèles sont fournis pour les trois types de fonctions en C# (par défaut), F# et Visual Basic. Lorsque vous créez un projet à partir d'un modèle, spécifiez -lang f# pour créer un projet F# ou -lang vb pour créer un projet Visual Basic. Par exemple, pour créer une fonction CloudEvent sans type pour Visual Basic, exécutez la commande suivante :

dotnet new gcf-untyped-event -lang vb

Exemples de fonctions HTTP

Les fonctions HTTP vous permettent d'appeler votre fonction via une requête HTTP(S). Les exemples suivants génèrent le message "Hello World!".

F#

namespace HelloWorldFSharp

open Google.Cloud.Functions.Framework
open Microsoft.AspNetCore.Http

type Function() =
    interface IHttpFunction with
        member this.HandleAsync context =
            async {
                do! context.Response.WriteAsync "Hello World!" |> Async.AwaitTask
            } |> Async.StartAsTask :> _

Visual Basic

Imports Google.Cloud.Functions.Framework
Imports Microsoft.AspNetCore.Http

Public Class CloudFunction
    Implements IHttpFunction

    Public Async Function HandleAsync(context As HttpContext) As Task Implements IHttpFunction.HandleAsync
        Await context.Response.WriteAsync("Hello World!")
    End Function
End Class

Fichiers de projet pour les exemples HTTP

Voici les fichiers de projet pour les exemples ci-dessus :

F#

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net6.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <Compile Include="Function.fs" />
  </ItemGroup>

  <ItemGroup>
    <PackageReference Include="Google.Cloud.Functions.Hosting" Version="2.2.1" />
  </ItemGroup>
</Project>

Visual Basic

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <RootNamespace>HelloWorldVb</RootNamespace>
    <TargetFramework>net6.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Google.Cloud.Functions.Hosting" Version="2.2.1" />
  </ItemGroup>
</Project>

Déployer les fonctions HTTP

F#

gcloud functions deploy fsharp-helloworld --no-gen2 --entry-point HelloWorldFSharp.Function --runtime dotnet6 --trigger-http --allow-unauthenticated

Visual Basic

gcloud functions deploy vb-helloworld --no-gen2 --entry-point HelloWorldVb.CloudFunction --runtime dotnet6 --trigger-http --allow-unauthenticated

Exemples CloudEvent

Utilisez les fonctions CloudEvent lorsque vous souhaitez que votre fonction Cloud Run soit appelée indirectement en réponse à un événement asynchrone, tel qu'un message sur un sujet Pub/Sub, une modification dans un bucket Cloud Storage ou un événement Firebase.

F#

namespace HelloPubSubFSharp

open Google.Cloud.Functions.Framework
open Google.Events.Protobuf.Cloud.PubSub.V1
open Microsoft.Extensions.Logging
open System
open System.Threading.Tasks

type Function(logger: ILogger<Function>) =
    interface ICloudEventFunction<MessagePublishedData> with
        member this.HandleAsync(cloudEvent, data, cancellationToken) =
            let nameFromMessage = data.Message.TextData
            let name = if String.IsNullOrEmpty(nameFromMessage) then "world" else nameFromMessage
            logger.LogInformation("Hello {name}", name)
            Task.CompletedTask

Visual Basic

Imports System.Threading
Imports CloudNative.CloudEvents
Imports Google.Cloud.Functions.Framework
Imports Google.Events.Protobuf.Cloud.PubSub.V1
Imports Microsoft.Extensions.Logging

Public Class CloudFunction
    Implements ICloudEventFunction(Of MessagePublishedData)

    Private _logger As ILogger

    Public Sub New(ByVal logger As ILogger(Of CloudFunction))
        _logger = logger
    End Sub


    Public Function HandleAsync(cloudEvent As CloudEvent, data As MessagePublishedData, cancellationToken As CancellationToken) As Task _
        Implements ICloudEventFunction(Of MessagePublishedData).HandleAsync

        Dim nameFromMessage = data.Message?.TextData
        Dim name = If(String.IsNullOrEmpty(nameFromMessage), "world", nameFromMessage)
        _logger.LogInformation("Hello {name}", name)

        Return Task.CompletedTask
    End Function
End Class

Déployer les fonctions CloudEvent

F#

gcloud functions deploy fsharp-hello-pubsub --no-gen2 --entry-point HelloPubSubFSharp.Function --runtime dotnet6 --trigger-topic my-topic --allow-unauthenticated

Visual Basic

gcloud functions deploy vb-hello-pubsub --no-gen2 --entry-point HelloPubSubVb.CloudFunction --runtime dotnet6 --trigger-topic my-topic --allow-unauthenticated

Tester les exemples CloudEvent

Vous pouvez tester les exemples de fonctions CloudEvent comme suit :

  1. Publiez un message sur votre sujet Pub/Sub pour déclencher votre fonction :

    gcloud pubsub topics publish my-topic --message Flurry
  2. Examinez les journaux :

    gcloud functions logs read --limit 10

Un message semblable au suivant doit s'afficher, contenant le nom que vous avez publié dans le sujet Pub/Sub :

D      my-function  ...  Function execution started
I      my-function  ...  Hello Flurry!
D      my-function  ...  Function execution took 39 ms, finished with status: 'ok'