在函数计算中使用 C# 编程,需要定义一个函数作为入口函数。为函数设置 HTTP 触发器后,可以直接处理发来的 HTTP 请求,方便搭建 Web 应用。

背景信息

函数计算使用 C# 编写 HTTP 函数,需要 Nuget 引入 Aliyun.Serverless.CoreAliyun.Serverless.Core.Http 包。

一个简单的 C# HTTP 函数示例如下所示。

using System.Threading.Tasks;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Aliyun.Serverless.Core;
using Aliyun.Serverless.Core.Http;

namespace MySpace.TestHandlers
{
    public class SingleHttpHandler : FcHttpEntrypoint
    {
        protected override void Init(IWebHostBuilder builder)
        { }


        public override async Task<HttpResponse> HandleRequest(HttpRequest request, HttpResponse response, IFcContext fcContext)
        {
            response.StatusCode = 200;
            response.ContentType = "text/plain";

            await response.WriteAsync("hello world");

            return response;
        }
    }
}         

函数入参如下所示:

说明 C# HTTP 函数必须继承 Aliyun.Serverless.Core.Http 中的 FcHttpEntrypoint,其中 Init 函数必须重写,HandleRequest 是函数入口 handler,可以根据情况决定是否重写。
  • Single function:重写 HandleRequestHandleRequest 实现自定义的逻辑处理。

  • Asp.net core application:只需要重写 Init 函数。

HTTP 函数示例

  • Single function 示例

    以下示例演示了如何使用 HTTP 函数中的 HttpRequestHttpResponse

    using System.IO;
    using System.Threading.Tasks;
    using Microsoft.AspNetCore.Hosting;
    using Microsoft.AspNetCore.Http;
    using Aliyun.Serverless.Core;
    using Aliyun.Serverless.Core.Http;
    
    using Microsoft.Extensions.Logging;
    namespace MySpace.TestHandlers
    {
        public class SingleHttpHandler : FcHttpEntrypoint
        {
            protected override void Init(IWebHostBuilder builder)
            { 
            }
    
            public override async Task<HttpResponse> HandleRequest(HttpRequest request, HttpResponse response, IFcContext fcContext)
            {
                string method = request.Method;
                string relativePath = request.Path.Value;
                fcContext.Logger.LogInformation("method = {0}; requestPath = {1}", method, relativePath);
    
                StreamReader sr = new StreamReader(request.Body);
                string requestBody = sr.ReadToEnd();
                fcContext.Logger.LogInformation("requestBody = {}", requestBody);
    
                // process request.Headers
    
                response.StatusCode = 200;
                response.Headers["Content-Type"]="text/plain";
                response.Headers.Add("customheader", "v1");
    
                await response.WriteAsync("hello world");
    
                return response;
            }
        }
    }           
    说明 如果使用 Single function,请参见事件函数完整示例,创建 console 工程,新建 FcRemoteEntrypoint.cs,代码改成 Single function 示例代码即可。
  • Asp.net core application 示例
    using System;
    using Aliyun.Serverless.Core.Http;
    using Microsoft.AspNetCore.Hosting;
    namespace MySpace.TestWebApi
    {
        public class FcRemoteEntrypoint : FcHttpEntrypoint
        {
             protected override void Init(IWebHostBuilder builder)
            {
                builder
                    .UseStartup<Startup>();
            }
        }
    }          

使用步骤

  1. 创建一个名为 asp.net core 的 webapi 工程。
        [songluo@~/tmp]# mkdir fcaspdotnetsample
        [songluo@~/tmp]# cd fcaspdotnetsample
        [songluo@~/tmp/fcaspdotnetsample]# dotnet new webapi                 
  2. fcaspdotnetsample.csproj 中添加包,如下所示。
    <ItemGroup>
            <PackageReference Include="Aliyun.Serverless.Core" Version="1.0.1" />
            <PackageReference Include="Aliyun.Serverless.Core.Http" Version="1.0.2" />
    </ItemGroup>                  
  3. 新建一个名为 FcRemoteEntrypoint.cs 的文件,文件内容请参见上文 Asp.net core application 示例代码。
  4. 上传工程并将目标文件打成压缩包。
        [songluo@~/tmp/fcaspdotnetsample]# dotnet publish -c Release
        Microsoft (R) Build Engine version 15.9.20+g88f5fadfbe for .NET Core
        Copyright (C) Microsoft Corporation. All rights reserved.
    
      Restore completed in 88.39 ms for /Users/songluo/tmp/fcaspdotnetsample/fcaspdotnetsample.csproj.
      fcaspdotnetsample -> /Users/songluo/tmp/fcaspdotnetsample/bin/Release/netcoreapp2.1/fcaspdotnetsample.dll
      fcaspdotnetsample -> /Users/songluo/tmp/fcaspdotnetsample/bin/Release/netcoreapp2.1/publish/
        [songluo@~/tmp/fcaspdotnetsample]# cd /Users/songluo/tmp/fcaspdotnetsample/bin/Release/netcoreapp2.1/publish/
        [songluo@~/tmp/fcaspdotnetsample/bin/Release/netcoreapp2.1/publish]# zip -r fcaspdotnetsample.zip *
      adding: appsettings.Development.json (deflated 40%)
      adding: appsettings.json (deflated 30%)
      adding: fcaspdotnetsample.deps.json (deflated 85%)
      adding: fcaspdotnetsample.dll (deflated 61%)
      adding: fcaspdotnetsample.pdb (deflated 40%)
      adding: fcaspdotnetsample.runtimeconfig.json (deflated 31%)
      adding: web.config (deflated 40%)
        [songluo@~/tmp/fcaspdotnetsample/bin/Release/netcoreapp2.1/publish]# ls -ll fcaspdotnetsample.zip
        -rw-r--r--  1 songluo  staff  39101 Mar 15 09:47 fcaspdotnetsample.zip                
  5. 使用 fcaspdotnetsample.zip 创建 runtime 为 dotnetcore2.1、handlerfcaspdotnetsample::MySpace.TestWebApi.FcRemoteEntrypoint::HandleRequest 的函数。

HTTP 函数限制项

  • 请求限制项

    如果 HTTP 触发器的函数入口请求超过以下限制,会抛出 400 状态码和 InvalidArgument 错误码。

    参数 限制 HTTP 状态码 错误码
    headers 请求头中的所有键和值的大小不能超过 4 KB。 400 InvalidArgument
    path path 以及所有查询参数的大小不能超过 4 KB。
    body HTTP 请求体的大小不能超过 6 MB。
  • 响应限制项

    如果响应超过以下限制,会抛出 502 状态码和 BadResponse 错误码。

    参数 限制 HTTP 状态码 错误码
    headers headers 中的所有键和值的大小不能超过 4 KB。 502 BadResponse
    body HTTP 响应体的大小不能超过 6 MB。

更多信息

HTTP 触发器更多使用信息,请参见 HTTP 触发器