Linguagens .NET

É possível escrever a sua função usando diferentes linguagens .NET (C#, Visual Basic ou F#). A tarefa principal é a mesma em todos os idiomas: cria uma classe que implementa uma das interfaces do Functions Framework:

Este documento fornece exemplos para F# e Visual Basic.

Modelos

Tenha em atenção que, para executar os exemplos neste documento, vai usar os modelos:

  1. Instale o SDK.NET.

  2. Instale o pacote de modelos:

    dotnet new install Google.Cloud.Functions.Templates
    

São fornecidos modelos para os três tipos de funções em C# (a predefinição), F# e Visual Basic. Quando criar um novo projeto a partir de um modelo, especifique -lang f# para criar um projeto F# ou -lang vb para criar um projeto do Visual Basic. Por exemplo, para criar uma nova função CloudEvent não tipada para Visual Basic, executaria o seguinte comando:

dotnet new gcf-untyped-event -lang vb

Exemplos de funções HTTP

Use funções HTTP quando quiser invocar a sua função através de um pedido HTTP(S). Os exemplos seguintes geram a mensagem "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

Ficheiros de projeto para exemplos HTTP

Seguem-se os ficheiros de projeto dos exemplos acima:

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>

Implementar as funções 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

Exemplos de CloudEvents

Use funções CloudEvent quando quiser que a sua função do Cloud Run seja invocada indiretamente em resposta a um evento assíncrono, como uma mensagem num tópico do Pub/Sub, uma alteração num contentor do Cloud Storage ou um evento do 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

Implementar as funções 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

Teste os exemplos de CloudEvent

Pode testar os exemplos de CloudEvent da seguinte forma:

  1. Publique uma mensagem no seu tópico Pub/Sub para acionar a sua função:

    gcloud pubsub topics publish my-topic --message Flurry
  2. Consulte os registos:

    gcloud functions logs read --limit 10

Deve ver algo semelhante a isto, com uma mensagem que inclui o nome que publicou no tópico do 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'