全部產品
Search
文件中心

:事件請求處理常式(Event Handler)

更新時間:Jul 06, 2024

本文介紹C#事件請求處理常式的結構和特點。

處理常式介面

當您建立一個基於C#的函數時,需要指定一個Handler方法,該方法在函數執行時被執行。這個Handler方法可以是Static方法或Instance方法。如果您想在Handler方法中訪問IFcContext對象,則需要將該方法中的第二個參數指定為IFcContext對象。事件函數支援的Handler方法定義如下所示。

ReturnType HandlerName(InputType input, IFcContext context);  //包含IFcContext。
ReturnType HandlerName(InputType input); // 不包含IFcContext。
Async Task<ReturnType> HandlerName(InputType input, IFcContext context);
Async Task<ReturnType> HandlerName(InputType input);
Function Compute支援在使用C#編寫的函數中應用Async,此時函數的執行會等待非同步方法呼叫執行結束。以下是對ReturnType、InputType和IFcContext的說明。
  • ReturnType:返回對象可以是voidSystem.IO.Stream對象或者任何可以被JSON序列化和還原序列化的對象。如果返回對象是Stream,該Stream內容將直接在響應體返回,否則返回對象被JSON序列化後,在響應體返回。
  • InputType:輸入參數可以是System.IO.Stream或任何可以被JSON序列化和還原序列化的對象。
  • IFcContext:函數的Context對象。更多資訊,請參見上下文

事件請求處理常式類型

Function Compute使用C#編寫函數,需要引入Aliyun.Serverless.Core依賴包,可以通過以下方式在.csproj檔案中引入該依賴包。

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

Aliyun.Serverless.Core包為事件請求處理常式定義了兩個參數類型。

  • Stream Handler

    以流的方式接收輸入的event事件並返回執行結果,您需要從輸入資料流中讀取調用函數時的輸入,處理完成後把函數執行結果寫入到輸出資料流中來返回。

  • POCO Handler

    通過POCO(Plain old CLR objects)方式,您可以自訂輸入和輸出的類型,但是輸入和輸出的類型必須是POCO類型。

Stream Handler

一個最簡單的Stream Handler樣本如下所示。
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){}
    }
}
樣本解析如下。
  • 命名空間和類

    命名空間為Example,類名為Hello,方法名為StreamHandler,假設程式集名稱為HelloFcApp,則請求處理常式的配置為HelloFcApp::Example.Hello::StreamHandler

  • 參數Stream input

    處理常式的輸入,該樣本的輸入類型為Stream。

  • 參數IFcContext context(可選)

    內容物件,包含函數和請求的資訊。

  • 傳回值Task<Stream>

    傳回值為Stream類型。

POCO Handler

一個最簡單的POCO Handler樣本如下所示。
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; }
        }

        // optional serializer class, if it’s not specified, the default serializer (based on JSON.Net) will be used.
        // [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){}
    }
}
除了Stream作為輸入輸出參數,POCO(Plain old CLR objects)對象同樣也可以作為輸入和輸出。如果該POCO沒有指定特定的JSON序列化對象,則Function Compute預設使用JSON.Net進行對象的JSON序列化和還原序列化。具體解析如下。
  • 命名空間和類

    命名空間為Example,類名為Hello,方法名為PocoHandler,假設程式集名稱為 HelloFcApp, 則請求處理常式的配置為HelloFcApp::Example.Hello::PocoHandler

  • 參數Product product

    處理常式的輸入,該樣本的輸入類型為Product Class。如果該POCO沒有指定特定的JSON序列化對象,則Function Compute預設使用JSON.Net進行對象的JSON還原序列化。

  • 參數IFcContext context(可選)

    內容物件,包含函數和請求的資訊。

  • 傳回值Product

    傳回值為POCO Product類型。如果該POCO沒有指定特定的JSON序列化對象,則Function Compute預設使用JSON.Net進行對象的JSON序列化。

自訂序列化介面(Custom Serializer)

Function Compute針對POCO Handler提供了預設的基於JSON .NET的序列化介面。如果預設的序列化介面不能滿足需求,您可以基於Aliyun.Serverless.Core中的介面IFcSerializer實現自訂序列化介面。

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

樣本程式

Function Compute官方庫包含使用各種處理常式類型和介面的應用程式範例。每個應用程式範例都包含用於輕鬆編譯部署的方法。