Penanganan C# adalah metode yang dipanggil oleh Function Compute saat fungsi Anda dijalankan. Topik ini menjelaskan format string penanganan, signature metode yang valid, jenis penanganan yang didukung (stream dan POCO), opsi serialisasi, serta cara menangani pemanggilan pemicu HTTP.
Jika Anda ingin menggunakan pemicu HTTP atau nama domain kustom untuk mengakses fungsi, peroleh struktur permintaan terlebih dahulu sebelum menentukan respons HTTP. Untuk informasi selengkapnya, lihat Gunakan pemicu HTTP untuk memanggil fungsi.
Format string penanganan
String penanganan C# mengikuti format berikut:
Assembly::Namespace.ClassName::MethodName| Parameter | Deskripsi |
|---|---|
Assembly | Nama assembly |
Namespace | Nama namespace |
ClassName | Nama kelas |
MethodName | Nama metode |
Sebagai contoh, jika nama assembly-nya adalah HelloFcApp, maka penanganannya adalah HelloFcApp::Example.HelloFC::StreamHandler.
Konfigurasikan string penanganan saat membuat atau memperbarui fungsi di Konsol Function Compute. Untuk informasi selengkapnya, lihat Buat fungsi event.
Signature penanganan yang valid
Metode penanganan dapat berupa metode statis atau metode instans. Semua signature yang didukung tercantum di bawah ini. Parameter IFcContext bersifat opsional dalam semua bentuk.
// Signature sinkron
ReturnType HandlerName(InputType input, IFcContext context);
ReturnType HandlerName(InputType input);
// Signature asinkron
async Task<ReturnType> HandlerName(InputType input, IFcContext context);
async Task<ReturnType> HandlerName(InputType input);Function Compute menunggu hingga metode async selesai sebelum mengembalikan respons.
Jenis parameter:
| Parameter | Jenis yang diterima |
|---|---|
ReturnType | void, System.IO.Stream, atau objek apa pun yang dapat diserialisasi ke JSON. Nilai kembali berupa Stream ditulis langsung ke badan respons; jenis lainnya terlebih dahulu diserialisasi ke JSON. |
InputType | System.IO.Stream atau objek apa pun yang dapat dideserialisasi dari JSON |
IFcContext | Objek konteks fungsi. Untuk informasi selengkapnya, lihat Konteks. |
Penanganan event
Penanganan event C# memerlukan paket NuGet Aliyun.Serverless.Core (versi 1.0.1). Tambahkan ke file .csproj Anda:
<ItemGroup>
<PackageReference Include="Aliyun.Serverless.Core" Version="1.0.1" />
</ItemGroup>Paket ini menyediakan dua jenis penanganan:
Penanganan stream — menerima data event mentah sebagai aliran dan menulis hasil ke aliran output.
Penanganan POCO — menggunakan plain old class objects (POCO) untuk input dan output bertipe, dengan serialisasi JSON otomatis.
Penanganan stream
Penanganan stream membaca input dari Stream dan mengembalikan 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){}
}
}Untuk assembly HelloFcApp, string penanganan untuk contoh ini adalah:
HelloFcApp::Example.Hello::StreamHandlerElemen utama:
| Elemen | Deskripsi |
|---|---|
Stream input | Data event input. Baca dari aliran ini di dalam penanganan Anda. |
IFcContext context | (Opsional) Objek konteks yang menyediakan metadata permintaan dan logging. |
Task<Stream> | Jenis nilai kembali. Konten aliran ditulis langsung ke badan respons. |
Penanganan POCO
Penanganan POCO menggunakan kelas C# bertipe untuk input dan output. Function Compute secara otomatis melakukan serialisasi dan deserialisasi objek-objek ini menggunakan JSON.Net (Newtonsoft.Json).
using Aliyun.Serverless.Core;
using Microsoft.Extensions.Logging;
namespace Example
{
public class Hello
{
public class Product
{
public string Id { get; set; }
public string Description { get; set; }
}
// Opsional: tentukan kelas serializer kustom.
// Jika dihilangkan, serializer JSON.Net default akan digunakan.
// [FcSerializer(typeof(MySerialization))]
public Product PocoHandler(Product product, IFcContext context)
{
string Id = product.Id;
string Description = product.Description;
context.Logger.LogInformation("Id {0}, Description {1}", Id, Description);
return product;
}
static void Main(string[] args){}
}
}Untuk assembly HelloFcApp, string penanganan untuk contoh ini adalah:
HelloFcApp::Example.Hello::PocoHandlerElemen utama:
| Elemen | Deskripsi |
|---|---|
Product product | Parameter input bertipe Product. Didenserialisasi dari muatan event menggunakan JSON.Net. |
IFcContext context | (Opsional) Objek konteks. |
Product (jenis nilai kembali) | Output yang diserialisasi ke JSON menggunakan JSON.Net dan ditulis ke badan respons. |
Serialisasi
Penanganan POCO menggunakan JSON.Net (Newtonsoft.Json) secara default, yang disediakan oleh Aliyun.Serverless.Core. Ini mencakup sebagian besar kasus penggunaan tanpa konfigurasi tambahan — Function Compute secara otomatis mendeserialisasi event masuk ke jenis input Anda dan menserialisasi nilai kembali ke badan respons.
Kapan menggunakan serializer kustom: jika Anda perlu menangani jenis khusus, konvensi penamaan kustom, atau format non-JSON, implementasikan antarmuka IFcSerializer:
public interface IFcSerializer
{
T Deserialize<T>(Stream requestStream);
void Serialize<T>(T response, Stream responseStream);
}Untuk menggunakan serializer kustom, terapkan atribut [FcSerializer] ke metode penanganan Anda:
[FcSerializer(typeof(MySerialization))]
public Product PocoHandler(Product product, IFcContext context) { ... }Gunakan pemicu HTTP untuk memanggil fungsi
Kode contoh
Contoh berikut mendefinisikan kelas bertipe untuk permintaan dan respons pemicu HTTP, membaca badan permintaan, lalu mengembalikannya.
using System;
using System.Collections.Generic;
using System.Text;
using System.Text.Json;
using Aliyun.Serverless.Core;
using Microsoft.Extensions.Logging;
namespace Example
{
public class Hello
{
public class HTTPTriggerEvent
{
public string Version { get; set; }
public string RawPath { get; set; }
public string Body { get; set; }
public bool IsBase64Encoded { get; set; }
public RequestContext RequestContext { get; set; }
public Dictionary<string, string> Headers { get; set; }
public Dictionary<string, string> QueryParameters { get; set; }
public override string ToString()
{
return JsonSerializer.Serialize(this);
}
}
public class RequestContext
{
public string AccountId { get; set; }
public string DomainName { get; set; }
public string DomainPrefix { get; set; }
public string RequestId { get; set; }
public string Time { get; set; }
public string TimeEpoch { get; set; }
public Dictionary<string, string> Http { get; set; }
}
public class HTTPTriggerResponse
{
public int StatusCode { get; set; }
public Dictionary<string, string> Headers { get; set; }
public bool IsBase64Encoded { get; set; }
public string Body { get; set; }
}
public HTTPTriggerResponse PocoHandler(HTTPTriggerEvent input, IFcContext context)
{
context.Logger.LogInformation("receive event: {0}", input.ToString());
string requestBody = input.Body;
if (input.IsBase64Encoded)
{
byte[] decodedBytes = Convert.FromBase64String(input.Body);
requestBody = Encoding.UTF8.GetString(decodedBytes);
}
return new HTTPTriggerResponse
{
StatusCode = 200,
IsBase64Encoded = false,
Body = requestBody
};
}
static void Main(string[] args){}
}
}Prasyarat
Sebelum memulai, pastikan Anda telah:
Membuat fungsi C# menggunakan kode contoh di atas. Untuk informasi selengkapnya, lihat Buat fungsi event dan Konfigurasikan pemicu HTTP.
Panggil fungsi
Masuk ke Konsol Function Compute. Di panel navigasi kiri, klik Functions.
Di bilah navigasi atas, pilih wilayah. Di halaman Functions, klik fungsi target.
Di halaman detail fungsi, klik tab Triggers untuk mendapatkan titik akhir publik pemicu HTTP.
Jalankan perintah berikut untuk memanggil fungsi. Ganti
https://test-python-ipgrwr****.cn-shanghai.fcapp.rundengan titik akhir Anda.curl -i "https://test-python-ipgrwr****.cn-shanghai.fcapp.run" -d 'Hello fc3.0'Respons yang diharapkan:
HTTP/1.1 200 OK Content-Disposition: attachment Content-Length: 12 Content-Type: application/json X-Fc-Request-Id: 1-64f7449a-127fbe39cd7681596e33ebad Date: Tue, 05 Sep 2023 15:09:14 GMT Hello fc3.0PentingJika Authentication Method diatur ke No Authentication, panggil menggunakan Postman atau curl.
Jika Authentication Method diatur ke Signature Authentication atau JWT Authentication, gunakan metode yang sesuai. Untuk informasi selengkapnya, lihat Autentikasi.
Kemungkinan error
Contoh ini dirancang untuk pemanggilan pemicu HTTP atau nama domain kustom. Jika Anda mengklik Test Function di konsol dan memberikan string biasa seperti "Hello, FC!", fungsi akan mengembalikan error deserialisasi karena input tidak sesuai dengan format HTTPTriggerEvent:
{
"errorMessage": "Unexpected character encountered while parsing value: H. Path '', line 0, position 0.",
"errorType": "Newtonsoft.Json.JsonReaderException",
"stackTrace": [
" at Newtonsoft.Json.JsonTextReader.ParseValue()",
" at Newtonsoft.Json.JsonReader.ReadAndMoveToContent()",
" at Newtonsoft.Json.JsonReader.ReadForType(JsonContract contract, Boolean hasConverter)",
" at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent)",
" at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType)",
" at Newtonsoft.Json.JsonSerializer.Deserialize(JsonReader reader, Type objectType)",
" at Newtonsoft.Json.JsonSerializer.Deserialize[T](JsonReader reader)",
" at Aliyun.Serverless.Core.JsonSerializer.Deserialize[T](Stream requestStream) in /dotnetcore/Libraries/src/Aliyun.Serverless.Core.Impl/JsonSerializer.cs:line 95"
]
}Program contoh
Repositori GitHub berikut berisi contoh lengkap beserta skrip build dan penerapan:
dotnet3-blank-stream-event — callback event menggunakan format penanganan stream
dotnet3-blank-poco-event — callback event menggunakan format penanganan POCO