Idiomas 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:
IHttpFunction
ICloudEvent<T>
genéricoICloudEvent
no genérico
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:
Instala el SDK de .NET.
Instala el paquete de plantillas:
dotnet new install Google.Cloud.Functions.Templates
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
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>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>
Implementa las funciones de 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
Ejemplos de CloudEvent
Debes usar funciones de CloudEvent cuando desees que se invoque tu función de Cloud Run 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 --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
Prueba los ejemplos de CloudEvent
Puedes probar los ejemplos de CloudEvent de la siguiente manera:
Publica un mensaje en tu tema de Pub/Sub para activar la función:
gcloud pubsub topics publish my-topic --message Flurry
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'