.NET 语言
您可以使用不同的 .NET 语言(C#、Visual Basic 或 F#)编写函数。所有语言的核心任务都相同 - 您创建一个实现某个 Functions 框架接口的类:
本文档提供了 F# 和 Visual Basic 示例。
模板
请注意,如需运行本文档中的示例,您将使用模板:
安装 .NET SDK。
安装模板软件包:
dotnet new install Google.Cloud.Functions.Templates
为 C#(默认)、F# 和 Visual Basic 三种类型的函数提供了模板。通过模板创建新项目时,指定 -lang f#
以创建 F# 项目,或指定 -lang vb
以创建 Visual Basic 项目。例如,如需为 Visual Basic 创建新的无类型 CloudEvent 函数,您需要运行以下命令:
dotnet new gcf-untyped-event -lang vb
HTTP 函数示例
如果要通过 HTTP(S) 请求调用您的函数,请使用 HTTP 函数。以下示例会输出 "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
用于 HTTP 示例的项目文件
以下是用于上述示例的项目文件:
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>
部署 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
CloudEvent 示例
如果您要在响应异步事件(例如 Pub/Sub 主题中收到消息、Cloud Storage 存储桶发生更改或 Firebase 事件)时间接调用 Cloud Run functions 函数,则可以使用 CloudEvent 函数。
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
部署 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
测试 CloudEvent 示例
您可以按如下方式测试 CloudEvent 示例:
向 Pub/Sub 主题发布消息以触发您的函数:
gcloud pubsub topics publish my-topic --message Flurry
查看日志:
gcloud functions logs read --limit 10
您应该会看到类似这样的内容,其中的一条消息包含您发布到 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'