.NET-Sprachen

Sie können die Funktion in verschiedenen .NET-Sprachen (C#, Visual Basic oder F#) schreiben. Die Hauptaufgabe ist in allen Sprachen gleich: Sie erstellen eine Klasse, die eine der Functions Framework-Schnittstellen implementiert:

Dieses Dokument enthält Beispiele für F# und Visual Basic.

Vorlagen

Zum Ausführen der Beispiele in diesem Dokument verwenden Sie die Vorlagen:

  1. Installieren Sie das .NET SDK.

  2. Installieren Sie das Vorlagenpaket:

    dotnet new install Google.Cloud.Functions.Templates
    

Für die drei Arten von Funktionen in C# (Standardeinstellung), F# und Visual Basic werden Vorlagen bereitgestellt. Geben Sie beim Erstellen eines neuen Projekts aus einer Vorlage -lang f# an, um ein F#-Projekt zu erstellen, oder -lang vb, um ein Visual Basic-Projekt zu erstellen. Wenn Sie beispielsweise eine neue CloudEvent-Funktion ohne Typ für Visual Basic erstellen möchten, führen Sie Folgendes aus:

dotnet new gcf-untyped-event -lang vb

Beispiele für F# und Visual Basic finden Sie unter .NET-Sprachen.

Beispiele für HTTP-Funktionen

Wenn Sie Ihre Funktion über eine HTTP(S)-Anfrage aufrufen möchten, verwenden Sie HTTP-Funktionen. In den folgenden Beispielen wird die Nachricht "Hello World!" ausgegeben.

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 :> _
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

Projektdateien für HTTP-Beispiele

Hier sind die Projektdateien für die obigen Beispiele:

<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>
<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>

HTTP-Funktionen bereitstellen

gcloud functions deploy fsharp-helloworld --entry-point HelloWorldFSharp.Function --runtime dotnet8 --trigger-http --allow-unauthenticated
gcloud functions deploy vb-helloworld --entry-point HelloWorldVb.CloudFunction --runtime dotnet8 --trigger-http --allow-unauthenticated

CloudEvent-Beispiele

Sie verwenden CloudEvent-Funktionen, wenn die Cloud Run Functions-Funktion indirekt als Reaktion auf ein asynchrones Ereignis wie eine Nachricht in einem Pub/Sub-Thema, eine Änderung in einem Cloud Storage-Bucket oder ein Firebase-Ereignis aufgerufen werden soll.

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
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

CloudEvent-Funktionen bereitstellen

gcloud functions deploy fsharp-hello-pubsub --entry-point HelloPubSubFSharp.Function --runtime dotnet8 --trigger-topic my-topic --allow-unauthenticated
gcloud functions deploy vb-hello-pubsub --entry-point HelloPubSubVb.CloudFunction --runtime dotnet8 --trigger-topic my-topic --allow-unauthenticated

CloudEvent-Beispiele testen

So können Sie die CloudEvent-Beispiele testen:

  1. Veröffentlichen Sie eine Nachricht in Ihrem Pub/Sub-Thema, um die Funktion auszulösen:

    gcloud pubsub topics publish my-topic --message Flurry
  2. Sehen Sie sich die Logs an:

    gcloud functions logs read --limit 10

Sie sollten in etwa so etwas mit einer Nachricht mit dem Namen sehen, den Sie im Pub/Sub-Thema veröffentlicht haben:

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