.NET Core 编写 Azure Function 并连接 GitHub 持续部署
點擊上方藍字關注“汪宇杰博客”
導語
Azure Function 是一個事件驅動型無服務器計算平臺,可以解決復雜的業務流程問題,更加高效地進行開發。在本地構建和調試,而無需額外的設置,在云中大規模部署和操作,并使用觸發器和綁定集成服務。對我來說,Function 能幫助我快速開發一些簡單的API,我只需要編寫業務代碼,而無需構建完整的應用框架等基礎代碼。本文將會講解如何使用.NET Core,C#語言,開發一個簡單的 http 觸發的 Function 應用,并完成 GitHub 的持續部署配置。
需求
我需要一個 API,用于返回客戶端 IP 以及 User-Agent 字符串。但是我不想為了做這么一件簡單的事,而創建一個完整的 ASP.NET Core Web API 項目。我只關心我要進行的業務邏輯,不想編寫和管理配置文件、依賴注入、Controller、驗證等基礎代碼。
準備開發環境
我們需要以下開發條件:
賣血買到的 Azure 訂閱
丐版 Visual Studio 2019 Community 或豪版 Enterprise
Azure development workload
免費開源的 .NET Core 2.1 / 2.2 SDK
創建 Function 應用
在 VS2019 里,選擇 Azure 分類下的 Azure Function,新建一個工程。如:Edi.AzureFunctions
默認的.NET Core版本為2.1,我們可以手工改成2.2。編輯?Edi.AzureFunctions.csproj文件,將?TargetFramework 改成?netcoreapp2.2
同樣,也可以將?Microsoft.NET.Sdk.Functions 升級到最新版。
<Project Sdk="Microsoft.NET.Sdk">
? <PropertyGroup>
? ? <TargetFramework>netcoreapp2.2</TargetFramework>
? ? <AzureFunctionsVersion>v2</AzureFunctionsVersion>
? </PropertyGroup>
? <ItemGroup>
? ? <PackageReference Include="Microsoft.NET.Sdk.Functions" Version="1.0.29" />
? </ItemGroup>
? <ItemGroup>
? ? <None Update="host.json">
? ? ? <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
? ? </None>
? ? <None Update="local.settings.json">
? ? ? <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
? ? ? <CopyToPublishDirectory>Never</CopyToPublishDirectory>
? ? </None>
? </ItemGroup>
</Project>
將默認類改名為?ClientInfoFuncion,完成我們的業務代碼:取客戶端IP及User-Agent
public static class ClientInfoFuncion
{
[FunctionName("IP")]
? ? public static IActionResult GetClientIp(
? ? ? ? [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
? ? ? ? ILogger log)
? ? {
? ? ? ? log.LogInformation("Requesting client IP.");
? ? ? ? var ip = req.HttpContext.Connection.RemoteIpAddress.ToString();
? ? ? ? return ip != null
? ? ? ? ? ? ? (ActionResult)new OkObjectResult($"{ip}")
? ? ? ? ? ? : new BadRequestObjectResult("ip is null");
? ? }
[FunctionName("UserAgent")]
? ? public static IActionResult GetClientUserAgent(
? ? ? ? [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
? ? ? ? ILogger log)
? ? {
? ? ? ? log.LogInformation("Requesting client User-Agent.");
? ? ? ? var ua = req.Headers["User-Agent"].ToString();
? ? ? ? return ua != null
? ? ? ? ? ? ? (ActionResult)new OkObjectResult($"{ua}")
? ? ? ? ? ? : new BadRequestObjectResult("user-agent is null");
? ? }
}
可以發現,Azure Function 的代碼非常類似 ASP.NET Core MVC / Web API,返回類型正是?Microsoft.AspNetCore.Mvc.IActionResult,然而我們無需關心如何構建一個完整的ASP.NET Core Web API工程,也無需知道 Controller 的存在,只要編寫業務邏輯即可。
FunctionName 可以理解為 ASP.NET Core 中的 Route,也就是最終用戶調用 API 的 endpoint 地址。
[FunctionName("IP")] 也就最終對應:
https://你的function地址/api/IP
HttpTrigger 是 Azure Function 的一種觸發器,表示通過HTTP請求,觸發你寫的業務邏輯。此處我允許匿名訪問,并限定為 get / post 兩種HTTP Verb。
ILogger 接口中的日志最終會輸出到 Azure Function 的后臺,用于調試。
按 F5 啟動本地調試。會看見一個很炫酷的命令行窗口,里面啟動的是本地的 Azure Function 模擬器。
模擬器準備完成后,控制臺會輸出兩個綠色的URL地址,用于本地測試。
復制URL到瀏覽器,完成測試。
從 VS 創建和部署 Azure Function
在?Edi.AzureFunctions 點擊右鍵,選擇 Publish
點擊 Start,選擇 Azure Functions Consumption Plan,然后選擇 Create New。如果你已經在 Azure 上創建過一個 Function 應用,則可選擇 Select Existing。關于如何從 Azure portal 創建一個 Function 應用,在稍后討論。
根據需要填寫參數
最后點擊 Publish 完成發布
如果發布成功,你可以在 Azure portal 里找到這個 Function 應用,并能看見其 URL
嘗試在瀏覽器中訪問兩個API,分別是:
https://你的function名稱.azurewebsites.net/api/ip
https://你的function名稱.azurewebsites.net/api/useragent
你也可以在 Functions 下進入具體的 HttpTrigger,并在 Azure Portal 里完成測試。這會輸出更詳細的日志信息。
在 Azure Portal 創建 Function
剛才的例子里,我們通過 VS2019 一條龍開發和部署了一個Azure Function,而在實際應用中,通常不會這樣操作。因為 Azure Portal 給我們提供了更細致的參數選項,以便根據自己的需求調整。要從 Azure Portal 創建一個空的Function 應用也十分簡單,點擊 Function App / Add?
輸入 App name,它將作為該function默認域名使用。
其他參數根據自己需要設置。我建議大家重用既有的 App Service Plan,這樣可以省錢。
Runtime Stack 選擇 .NET Core
從 GitHub 倉庫持續部署
我在之前的博客文章中介紹過了 Azure DevOps 的CI/CD流程,非常強大。但是本文給大家介紹一個更簡單,但是略為基礎的發布方式。
實際上 Function 的本質是對 App Service 的進一步包裝,所以包括部署在內的大部分 App Service 的功能這里也能用。在 Platform features 里進入 Deployment Center
代碼來源選擇 GitHub
選擇 Kudu 編譯
我已將本文的代碼上傳到?https://github.com/EdiWang/Edi.AzureFunctions
在 Azure 里選擇對應的倉庫以及分支,并完成配置。
完成配置后,會立即觸發一次部署,可以看到詳細日志。
部署成功后,刷新左邊的 Functions 就能看見我們的兩個 API 了
如果你是個土豪,有自己的域名和證書,也可以綁定自定義域名。就像我這樣:
最后,就能優雅的通過自己的域名訪問 Function 了!
總結
以上是生活随笔為你收集整理的.NET Core 编写 Azure Function 并连接 GitHub 持续部署的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 统一流控服务开源:基于.Net Core
- 下一篇: asp.net ajax控件工具集 Au