您可以在本地.NET運行環境編譯器,打包為ZIP包,然後在Function Compute控制台或使用Serverless Devs工具上傳程式碼封裝,並正確運行您的代碼。
C#運行時依賴庫
Function Compute為C#運行時提供依賴庫Aliyun.Serverless.Core,用於定義請求處理常式介面,Context對象等資訊。
您可以通過Nuget程式包獲得以上依賴庫,將其添加到代碼目錄下的<YourProjectName>.csproj檔案中。如下所示。
<ItemGroup>
<PackageReference Include="Aliyun.Serverless.Core" Version="1.0.1" />
<PackageReference Include="Aliyun.Serverless.Core.Http" Version="1.0.3" />
</ItemGroup>
使用.NET Core CLI工具編譯並部署程式
.NET Core部署程式包,需要包含您的函數的已編譯器集以及其所有程式集的依賴項。您可以直接使用.NET Core CLI工具編譯器。使用 .NET Core CLI工具,您可以通過跨平台方式建立基於.NET的Function Compute應用程式。具體操作,請參見.NET。
步驟一:建立.NET專案
執行以下命令建立.NET專案。
dotnet new console -o HelloFcApp -f netcoreapp3.1
參數解析如下。
new console:推薦使用控制台應用程式模板。
-o|--output:專案的輸出位置。本文樣本中,會建立一個HelloFcApp目錄,並將專案內容放置到該目錄下。
-f|--framework:指定使用的.NET版本。如果運行時版本為.NET Core 3.1,該參數使用netcoreapp3.1;如果運行時版本為.NET Core 2.1,該參數使用netcoreapp2.1。
建立完成後,專案目錄結構如下所示。
HelloFcApp ├── HelloFcApp.csproj ├── Program.cs └── obj
在專案目錄下,根據實際情況修改檔案的參數配置。
HelloFcApp.csproj檔案
.NET工程的設定檔,記錄了專案的目標框架、程式集的依賴庫等資訊。您需要在該檔案中添加Function Compute提供的依賴庫,樣本如下。
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>netcoreapp3.1</TargetFramework> </PropertyGroup> <ItemGroup> <PackageReference Include="Aliyun.Serverless.Core" Version="1.0.1" /> <PackageReference Include="Aliyun.Serverless.Core.Http" Version="1.0.3" /> </ItemGroup> </Project>
Program.cs檔案
您的請求處理常式代碼,具體設定可參考請求處理常式(Handler)。本文以使用Stream類型的事件請求處理常式為例。
using System.IO; using System.Threading.Tasks; using Aliyun.Serverless.Core; using Microsoft.Extensions.Logging; namespace Example { public class Hello { public async Task<Stream> StreamHandler(Stream input, IFcContext context) { IFcLogger logger = context.Logger; logger.LogInformation("Handle request: {0}", context.RequestId); MemoryStream copy = new MemoryStream(); await input.CopyToAsync(copy); copy.Seek(0, SeekOrigin.Begin); return copy; } static void Main(string[] args){} } }
步驟二:編譯.NET專案
執行以下命令,進入專案目錄並編譯專案,然後將結果輸出到target目錄下。
cd HelloFcApp && dotnet publish -c Release -o ./target
執行以下命令,進入target目錄並進行打包。
cd target && zip -r HelloFcApp.zip *
打包完成後,ZIP包的結構如下所示。
HelloFcApp.zip ├── Aliyun.Serverless.Core.dll ├── HelloFcApp.deps.json ├── HelloFcApp.dll ├── HelloFcApp.pdb ├── HelloFcApp.runtimeconfig.json └── Microsoft.Extensions.Logging.Abstractions.dll
重要請確保已將HelloFcApp.dll等檔案打包至ZIP檔案的根目錄。
步驟三:部署專案代碼並驗證
登入Function Compute控制台,在左側導覽列,單擊函數。
在頂部功能表列,選擇地區,然後在函數頁面,單擊建立函數。
在建立函數頁面,選擇使用事件函數方式,設定函數相關配置項,然後單擊建立。
主要配置項說明如下,其餘配置項選擇預設值即可。
運行環境:選擇.NET Core 3.1。
代碼上傳方式:選擇通過 ZIP 包上傳代碼,然後上傳步驟2打包的ZIP檔案。
請求處理常式:設定為
HelloFcApp::Example.Hello::StreamHandler
。關於請求處理常式的格式說明,請參見請求處理常式(Handler)。
建立完成後,跳轉至函數詳情頁面的代碼頁簽。
在函數詳情頁面的代碼頁簽,單擊測試函數。
執行成功後返回以下結果。
{ "key1": "value1", "key2": "value2", "key3": "value3" }
您還可以單擊日誌輸出頁簽查看詳細日誌。
使用Serverless Devs編譯並部署
前提條件
操作步驟
執行以下命令,初始化專案。
s init
根據介面提示依次選擇阿里雲廠商、模板、運行時以及部署應用的地區和函數名稱等。
執行以下命令,進入專案目錄。
cd start-fc3-dotnetcore
代碼目錄結構如下。
start-fc3-dotnetcore ├── HelloFcApp │ ├── bin │ ├── obj │ ├── target │ ├── HelloWorldApp.csproj │ └── Program.cs ├── readme └── s.yaml
執行以下命令,部署專案。
s deploy
輸出樣本如下:
s.yaml: /root/start-fc3-dotnetcore/s.yaml Downloading[/v3/packages/fc3/zipball/0.0.24]... Download fc3 successfully Steps for [deploy] of [hello-world-app] ==================== Microsoft (R) Build Engine version 16.7.3+2f374e28e for .NET Copyright (C) Microsoft Corporation. All rights reserved. Determining projects to restore... Restored /root/start-fc3-dotnetcore/HelloWorldApp/HelloWorldApp.csproj (in 154 ms). HelloWorldApp -> /root/start-fc3-dotnetcore/HelloWorldApp/bin/Release/netcoreapp3.1/HelloWorldApp.dll HelloWorldApp -> /root/start-fc3-dotnetcore/HelloWorldApp/target/ [hello_world] completed (2.66s) Result for [deploy] of [hello-world-app] ==================== region: cn-hangzhou description: hello world by serverless devs functionName: start-dotnetcore-p6jp handler: HelloWorldApp::Example.Hello::StreamHandler internetAccess: true memorySize: 128 role: runtime: dotnetcore3.1 timeout: 10 A complete log of this run can be found in: /root/.s/logs/0327105651
執行
sudo s invoke
命令進行測試。輸出樣本如下:
Steps for [invoke] of [hello-world-app] ==================== ========= FC invoke Logs begin ========= FunctionCompute dotnetcore3.1 runtime inited. FC Invoke Start RequestId: 1-6603951e-157f3f32-7fe6f248d7d0 hello world! 你好,世界! FC Invoke End RequestId: 1-6603951e-157f3f32-7fe6f248d7d0 Duration: 117.33 ms, Billed Duration: 118 ms, Memory Size: 128 MB, Max Memory Used: 13.16 MB ========= FC invoke Logs end ========= Invoke instanceId: c-6603951e-15f440b6-2df37e4bf046 Code Checksum: 13273801077182424526 Qualifier: LATEST RequestId: 1-6603951e-157f3f32-7fe6f248d7d0 Invoke Result: hello world! 你好,世界! ✔ [hello_world] completed (0.72s) A complete log of this run can be found in: /root/.s/logs/0327114013