All Products
Search
Document Center

Function Compute:Penanganan

Last Updated:Apr 01, 2026

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.

Catatan

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
ParameterDeskripsi
AssemblyNama assembly
NamespaceNama namespace
ClassNameNama kelas
MethodNameNama 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:

ParameterJenis yang diterima
ReturnTypevoid, 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.
InputTypeSystem.IO.Stream atau objek apa pun yang dapat dideserialisasi dari JSON
IFcContextObjek 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::StreamHandler

Elemen utama:

ElemenDeskripsi
Stream inputData 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::PocoHandler

Elemen utama:

ElemenDeskripsi
Product productParameter 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:

Panggil fungsi

  1. Masuk ke Konsol Function Compute. Di panel navigasi kiri, klik Functions.

  2. Di bilah navigasi atas, pilih wilayah. Di halaman Functions, klik fungsi target.

  3. Di halaman detail fungsi, klik tab Triggers untuk mendapatkan titik akhir publik pemicu HTTP.

  4. Jalankan perintah berikut untuk memanggil fungsi. Ganti https://test-python-ipgrwr****.cn-shanghai.fcapp.run dengan 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.0
    Penting
    • Jika 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: