Lenguajes de .NET

Es posible escribir tu función mediante diferentes lenguajes de .NET (C#, Visual Basic o F#). La tarea principal es la misma en todos los lenguajes: debes crear una clase que implemente una de las interfaces de Functions Framework:

En este documento, se proporcionan ejemplos de F# y Visual Basic.

Plantillas

Ten en cuenta que para ejecutar los ejemplos de este documento, usarás las plantillas:

  1. Instala el SDK de .NET Core 3.1.

  2. Instala el paquete de plantillas:

    dotnet new -i Google.Cloud.Functions.Templates::1.0.0-beta04
    

Las plantillas se proporcionan para los tres tipos de funciones en C# (predeterminado), F# y Visual Basic. Cuando crees un proyecto nuevo a partir de una plantilla, especifica -lang f# para crear un proyecto de F# o -lang vb si deseas crear un proyecto de Visual Basic. Por ejemplo, si deseas crear una función nueva de CloudEvent sin tipo de Visual Basic, debes ejecutar lo siguiente:

dotnet new gcf-untyped-event -lang vb

Para ver ejemplos de F# y Visual Basic, consulta Lenguajes de .NET.

Ejemplos de funciones de HTTP

Debes usar funciones de HTTP cuando quieres invocar tu función a través de una solicitud HTTP(S). Los siguientes ejemplos generan el mensaje "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

Archivos de proyecto para ejemplos de HTTP

Estos son los archivos del proyecto de los ejemplos anteriores:

F#

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>

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

  <ItemGroup>
    <PackageReference Include="Google.Cloud.Functions.Hosting" Version="1.0.0-beta04" />
  </ItemGroup>
</Project>

Visual Basic

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

  <ItemGroup>
    <PackageReference Include="Google.Cloud.Functions.Hosting" Version="1.0.0-beta04" />
  </ItemGroup>
</Project>

Implementa las funciones de HTTP

F#

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

Visual Basic

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

Ejemplos de CloudEvent

Debes usar funciones de CloudEvent cuando desees que se invoque tu función de Cloud Functions de forma indirecta en respuesta a un evento asíncrono, como un mensaje en un tema de Pub/Sub, un cambio en un bucket de Cloud Storage o un evento de 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

Implementa las funciones de CloudEvent

F#

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

Visual Basic

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

Prueba los ejemplos de CloudEvent

Puedes probar los ejemplos de CloudEvent de la siguiente manera:

  1. Publica un mensaje en tu tema de Pub/Sub para activar la función:

    gcloud pubsub topics publish my-topic --message Flurry
  2. Consulta los registros:

    gcloud functions logs read --limit 10

Deberías ver algo como esto, con un mensaje que incluya el nombre que publicaste en el tema de 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'