全部产品
Search
文档中心

Function Compute:Penangan

更新时间:Jul 02, 2025

Anda dapat menggunakan penangan C# untuk menanggapi peristiwa yang diterima dan mengeksekusi logika bisnis yang sesuai. Topik ini menjelaskan konsep serta fitur dari penangan C# dan menyediakan contoh-contohnya.

Catatan

Jika Anda ingin menggunakan pemicu HTTP atau nama domain kustom untuk mengakses fungsi, peroleh struktur permintaan sebelum mendefinisikan respons HTTP. Untuk informasi lebih lanjut, lihat Gunakan pemicu HTTP untuk memanggil fungsi.

Apa itu penangan?

Penangan untuk sebuah fungsi di Function Compute adalah metode yang digunakan untuk memproses permintaan dalam kode fungsi. Ketika fungsi dipanggil, Function Compute menggunakan penangan yang telah dikonfigurasikan untuk memproses permintaan tersebut.

Anda dapat mengonfigurasikan penangan saat membuat atau memperbarui fungsi di Konsol Function Compute. Untuk informasi lebih lanjut, lihat Buat Fungsi Peristiwa.

Penangan fungsi C# di Function Compute mengikuti format Assembly::Namespace.ClassName::MethodName.

Parameter

Deskripsi

Assembly

Nama assembly yang dibuat.

Namespace

Nama namespace.

ClassName

Nama kelas.

MethodName

Nama metode.

Sebagai contoh, jika nama assembly adalah HelloFcApp, maka penanganannya adalah HelloFcApp::Example.HelloFC::StreamHandler. Contoh kode:

using System.IO;

namespace Example
{
    public class HelloFC
  {
      public async Task<Stream> StreamHandler(Stream input)
    {
        //logika fungsi
    }
  }
}

Konfigurasi penangan harus sesuai dengan spesifikasi Function Compute. Spesifikasi konfigurasi bervariasi berdasarkan jenis penangan.

Antarmuka Penangan

Saat membuat fungsi C#, Anda harus menentukan metode penangan yang akan dieksekusi ketika fungsi dipanggil. Metode penangan ini bisa berupa metode statis atau instansiasi. Jika Anda ingin mengakses objek IFcContext dalam metode penangan, tentukan parameter kedua sebagai objek IFcContext. Potongan kode berikut menunjukkan definisi metode penangan yang didukung oleh fungsi peristiwa.

ReturnType HandlerName(InputType input, IFcContext context);  //IFcContext termasuk 
ReturnType HandlerName(InputType input); //IFcContext tidak termasuk 
Async Task<ReturnType> HandlerName(InputType input, IFcContext context);
Async Task<ReturnType> HandlerName(InputType input);

Function Compute mendukung Async dalam fungsi C#. Jika Async digunakan, eksekusi fungsi akan menunggu hingga eksekusi metode asinkron selesai. Berikut deskripsi parameternya:

  • ReturnType: Tipe objek yang dikembalikan. Objek yang dikembalikan dapat berupa objek void atau System.IO.Stream, atau objek apa pun yang dapat diserialisasi dan dideserialisasi dalam JSON. Jika objek Stream dikembalikan, isi objek Stream langsung dikembalikan dalam badan respons. Jika tidak, objek tersebut dikembalikan dalam badan respons setelah diserialisasi dalam format JSON.

  • InputType: Tipe parameter input, yang dapat berupa objek System.IO.Stream atau objek yang dapat diserialisasi atau dideserialisasi dalam JSON.

  • IFcContext: Objek konteks fungsi. Untuk informasi lebih lanjut, lihat Konteks.

Penangan Peristiwa

Function Compute menulis fungsi dalam C#. Paket dependensi Aliyun.Serverless.Core diperlukan. Anda dapat memperkenalkan paket dependensi ke file .csproj menggunakan metode berikut:

  <ItemGroup>
        <PackageReference Include="Aliyun.Serverless.Core" Version="1.0.1" />
  </ItemGroup>

Paket Aliyun.Serverless.Core mendefinisikan dua tipe parameter untuk penangan peristiwa:

  • Penangan Aliran

    Menggunakan aliran untuk menerima data peristiwa event dan mengembalikan hasil eksekusi. Anda harus membaca data input dari aliran input lalu menulis hasil eksekusi ke aliran output.

  • Penangan POCO

    Memungkinkan Anda menyesuaikan data input dan output dalam objek kelas biasa (POCO).

Penangan Aliran

Contoh berikut memberikan kode sampel dari penangan aliran sederhana:

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("Menangani permintaan: {0}", context.RequestId);
            MemoryStream copy = new MemoryStream();
            await input.CopyToAsync(copy);
            copy.Seek(0, SeekOrigin.Begin);
            return copy;
        }

        static void Main(string[] args){}
    }
}

Deskripsi:

  • Namespace dan kelas

    Dalam kode sampel di atas, namespace adalah Example, nama kelas adalah Hello, dan nama metode adalah StreamHandler. Jika nama assembly adalah HelloFcApp, konfigurasi penangan adalah HelloFcApp::Example.Hello::StreamHandler.

  • Parameter Stream input

    Input penangan. Tipe input untuk contoh ini adalah Stream.

  • (Opsional) Parameter IFcContext context

    Objek konteks yang berisi informasi tentang fungsi dan permintaan.

  • Respons Task<Stream>

    Nilai kembali bertipe Stream.

Penangan POCO

Contoh berikut memberikan kode sampel dari penangan POCO sederhana:

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

        // Kelas serializer opsional. Jika tidak ditentukan, serializer default (berbasis JSON.Net) 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}, Deskripsi {1}", Id, Description);
            return product;
        }

        static void Main(string[] args){}
    }
}

Selain objek Stream, POCO juga dapat digunakan sebagai parameter input dan output. Jika POCO tidak menentukan objek serialisasi JSON tertentu, Function Compute menggunakan JSON.Net untuk melakukan serialisasi dan deserialisasi JSON objek tersebut. Deskripsi:

  • Namespace dan kelas

    Dalam kode sampel di atas, namespace adalah Example, nama kelas adalah Hello, dan nama metode adalah PocoHandler. Jika nama assembly adalah HelloFcApp, konfigurasi penangan adalah HelloFcApp::Example.Hello::PocoHandler.

  • Parameter Product product

    Input penangan. Tipe input untuk contoh ini adalah Kelas Produk. Jika POCO tidak menentukan objek serialisasi JSON tertentu, Function Compute menggunakan JSON.Net untuk melakukan deserialisasi JSON objek tersebut.

  • (Opsional) Parameter IFcContext context

    Objek konteks yang berisi informasi tentang fungsi dan permintaan.

  • Product respons.

    Nilai kembali bertipe POCO Product. Jika POCO tidak menentukan objek serialisasi JSON tertentu, Function Compute menggunakan JSON.Net untuk melakukan serialisasi JSON objek tersebut.

Serializer Kustom

Secara default, Function Compute menyediakan serializer berbasis pada Json.NET. Jika serializer default tidak dapat memenuhi persyaratan bisnis Anda, Anda dapat mengimplementasikan serializer kustom berbasis IFcSerializer di Aliyun.Serverless.Core.

public interface IFcSerializer
{
    T Deserialize<T>(Stream requestStream);
    void Serialize<T>(T response, Stream responseStream);
}      

Gunakan pemicu HTTP untuk memanggil fungsi

Kode sampel

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("menerima peristiwa: {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){}
    }
}

Sebelum Anda mulai

Anda telah menggunakan contoh di atas untuk membuat fungsi dalam runtime C#. Untuk informasi lebih lanjut, lihat Buat Fungsi Peristiwa dan Konfigurasikan Pemicu HTTP.

Prosedur

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

  2. Di bilah navigasi atas, pilih wilayah. Di halaman Functions, klik fungsi yang ingin Anda kelola.

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

  4. Jalankan perintah berikut di curl untuk memanggil fungsi:

    curl -i "https://test-python-ipgrwr****.cn-shanghai.fcapp.run" -d 'Halo fc3.0'

    Dalam perintah di atas, https://test-python-ipgrwr****.cn-shanghai.fcapp.run adalah titik akhir publik yang diperoleh dari pemicu HTTP.

    Penting
    • Jika parameter Authentication Method dari pemicu HTTP diatur ke No Authentication, Anda dapat menggunakan Postman atau curl untuk memanggil fungsi. Untuk informasi lebih lanjut, lihat Prosedur.

    • Jika parameter Authentication Method dari pemicu HTTP diatur ke Signature Authentication atau JWT Authentication, Anda dapat menggunakan metode tanda tangan atau metode otentikasi JWT untuk memanggil fungsi. Untuk informasi lebih lanjut, lihat Otentikasi.

    Hasil berikut dikembalikan:

    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
    
    Halo fc3.0

Kesalahan yang mungkin terjadi

Kode sampel ini dapat dipanggil menggunakan pemicu HTTP atau nama domain kustom. Jika Anda menggunakan operasi API tetapi parameter uji yang dikonfigurasi tidak sesuai dengan persyaratan format permintaan pemicu HTTP, kesalahan akan dilaporkan.

Sebagai contoh, respons berikut dikembalikan jika Anda memanggil fungsi dengan mengklik Test Function di Konsol Function Compute setelah mengonfigurasi parameter permintaan sebagai "Halo, FC!".

{
    "errorMessage": "Karakter tak terduga ditemui saat mem-parsing nilai: 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 sampel

Pustaka resmi Function Compute mencakup program sampel yang menggunakan berbagai jenis dan antarmuka penangan. Setiap program sampel mencakup metode untuk kompilasi dan penyebaran yang mudah.