日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

請求處理程序(Handler)

您可以使用C#請求處理程序響應接收到的事件并執行相應的業務邏輯。本文介紹C#請求處理程序的相關概念、結構特點和示例。

說明

如您需要通過HTTP觸發器或自定義域名訪問函數,請先獲取請求結構體再自定義HTTP響應。更多信息,請參見HTTP觸發器調用函數

什么是請求處理程序

FC函數的請求處理程序,是函數代碼中處理請求的方法。當您的FC函數被調用時,函數計算會運行您提供的Handler方法處理請求。

您可以通過函數計算控制臺,在創建或更新函數時為函數配置請求處理程序。具體操作,請參見創建事件函數

對于C#語言的FC函數,其請求處理程序的格式為程序集名稱::命名空間.類名::方法名Assembly::Namespace.ClassName::MethodName)。

參數

說明

Assembly

創建的程序集的名稱。

Namespace

命名空間名稱。

ClassName

類名。

MethodName

方法名。

假設程序集名稱為HelloFcApp,則請求處理程序的配置為HelloFcApp::Example.HelloFC::StreamHandler。一個簡單的程序示例如下。

using System.IO;

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

請求處理程序的具體配置均需符合函數計算平臺的配置規范。配置規范因請求處理程序類型而異。

處理程序接口

當您創建一個基于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);

函數計算支持在使用C#編寫的函數中應用Async,此時函數的執行會等待異步方法執行結束。以下是對ReturnType、InputType和IFcContext的說明。

  • ReturnType:返回對象可以是voidSystem.IO.Stream對象或者任何可以被JSON序列化和反序列化的對象。如果返回對象是Stream,該Stream內容將直接在響應體返回,否則返回對象被JSON序列化后,在響應體返回。

  • InputType:輸入參數可以是System.IO.Stream或任何可以被JSON序列化和反序列化的對象。

  • IFcContext:函數的Context對象。更多信息,請參見上下文

事件請求處理程序類型

函數計算使用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序列化對象,則函數計算默認使用JSON.Net進行對象的JSON序列化和反序列化。具體解析如下。

  • 命名空間和類

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

  • 參數Product product

    處理程序的輸入,該示例的輸入類型為Product Class。如果該POCO沒有指定特定的JSON序列化對象,則函數計算默認使用JSON.Net進行對象的JSON反序列化。

  • 參數IFcContext context(可選)

    上下文對象,包含函數和請求的信息。

  • 返回值Product

    返回值為POCO Product類型。如果該POCO沒有指定特定的JSON序列化對象,則函數計算默認使用JSON.Net進行對象的JSON序列化。

自定義序列化接口(Custom Serializer)

函數計算針對POCO Handler提供了默認的基于JSON .NET的序列化接口。如果默認的序列化接口不能滿足需求,您可以基于Aliyun.Serverless.Core中的接口IFcSerializer實現自定義序列化接口。

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

使用HTTP觸發器調用函數

示例代碼

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){}
    }
}

前提條件

已使用上述示例創建運行環境為C#的函數。具體操作,請參見創建事件函數配置HTTP觸發器并使用HTTP觸發

操作步驟

  1. 登錄函數計算控制臺,在左側導航欄,單擊函數

  2. 在頂部菜單欄,選擇地域,然后在函數頁面,單擊目標函數。

  3. 在函數詳情頁面,單擊觸發器管理頁簽,獲取HTTP觸發器的公網訪問地址。

  4. 在Curl工具執行以下命令,調用函數。

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

    以上命令中,https://test-python-ipgrwr****.cn-shanghai.fcapp.run為獲取到的HTTP觸發器公網訪問地址。

    重要
    • 如果HTTP觸發器的認證方式無需認證,您可以直接使用Postman或Curl工具來調用函數。具體操作,請參見本文操作步驟

    • 如果HTTP觸發器的認證方式簽名認證JWT認證,請使用簽名方式或JWT認證方式來調用函數。具體操作,請參見認證鑒權

    響應結果如下。

    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

錯誤分析

本示例代碼支持使用HTTP觸發器或者自定義域名調用。如果使用API調用,但配置的測試參數不符合HTTP觸發器請求格式規范時,會出現報錯。

例如,在控制臺上調用函數,配置請求參數為"Hello, FC!",單擊測試函數,收到的響應如下所示。

{
    "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"
    ]
}

示例程序

函數計算官方庫包含使用各種處理程序類型和接口的示例應用程序。每個示例應用程序都包含用于輕松編譯部署的方法。