以1個具體介面為例來展示騰訊雲.NET SDK的使用

  • 2020 年 3 月 13 日
  • 筆記

一、做足準備

【.NET Core和ASP.NET Core】是什麼,它們跟【.NET Framework和ASP.NET】的區別是什麼,為什麼要選用前者

https://docs.microsoft.com/zh-cn/dotnet/core/

https://docs.microsoft.com/zh-cn/dotnet/core/about

https://docs.microsoft.com/zh-cn/aspnet/core/?view=aspnetcore-3.1

概述里的3個鏈接介紹很詳細,建議仔細讀一下

.NET Core 是開放源程式碼通用開發平台,由 Microsoft 和 .NET 社區在 GitHub 上共同維護。 它跨平台(支援 Windows、macOS 和 Linux),並且可用於生成設備、雲和 IoT 應用程式。

.NET Core是.NET Framework的重新設計併兼容它,而且具備跨平台等多種優點。

ASP.NET Core是.NET Core的Web框架

ASP.NET是.NET Framework的Web框架

如果你在.NET Core和.NET Framework之間選了.NET Core,那在ASP.NET Core和ASP.NET之間肯定也是選ASP.NET Core了

不論是.NET Core還是.NET Framework,程式語言一般用C#。

二、環境安裝

依賴說明:https://docs.microsoft.com/zh-cn/dotnet/core/install/dependencies?pivots=os-linux&tabs=netcore31

需要先安裝依賴

yum install lttng-ust

yum install libcurl

yum install openssl-libs

yum install krb5-libs

yum install libicu

yum install zlib

yum install libunwind

yum install libuuid

安裝介紹:

https://dotnet.microsoft.com/download/dotnet-core/3.1

方式一,腳本安裝:https://dotnet.microsoft.com/download/dotnet-core/scripts

方式二,yum安裝:https://docs.microsoft.com/zh-cn/dotnet/core/install/linux-package-manager-centos7

請仔細看完上面幾個官方文檔

我選方式一,腳本安裝

我新購的centos7.4一上來沒安裝最開始說的各種依賴就直接下載腳本運行,明確告知我缺少哪些依賴

wget https://dotnetwebsite.azurewebsites.net/download/dotnet-core/scripts/v1/dotnet-install.sh

sh dotnet-install.sh

Ctrl+C停止後安裝依賴

yum install lttng-ust libcurl openssl-libs krb5-libs libicu zlib libunwind libuuid

然後重新執行腳本仍然報錯

zlib我明明安裝了的,如何是好?選方案二,yum安裝方式試試?不,遇到問題我不能躲。

分析下,centos7.4是什麼時候出的,.net core 3.1.102又是什麼時候出的?一前一後差幾年,我估計換個高版本的系統應該就可以了,想換centos8.0騰訊雲沒有,最高centos7.6,那就試試7.5或7.6吧,畢竟大版本相同,我估計出相同問題的概率比較大,試了果不其然都是一樣的告警,提示找不到zlib,我估計是.net core 3.1.102版本太高,需要的zlib版本也比較高吧,於是想到升級zlib到最新版本,只能源碼編譯安裝了。

這裡我犯了大錯,先卸載了當前zlib,想等卸載後再升級最新版,結果直接把系統搞壞了,這是因為系統底層很多命令和服務都依賴zlib庫。說下卸載過程:

用yum remove zlib卸載不了,我就想著用rpm -qa|grep zlib查看下版本是zlib-1.2.7-18.el7.x86_64

然後用rpm –nodeps -e zlib-1.2.7-18.el7.x86_64強制卸載,卸載後完蛋了,除過vim等幾個少數命令能用外,其他的命令全完蛋了,yum不能用、wget不能用、curl不能用、新開窗口重新SSH連不上系統,等等一系列報錯,報錯基本都是這句話

error while loading shared libraries: libz.so.1: cannot open shared object file: No such file or directory

可以說系統報廢了,只能找個正常機器查看下都哪些文件被刪掉了,然後用救援模式工具進去把這些文件放到原位置試試,其實主要是/usr/lib64/libz.so.1.2.7這一個文件,/usr/lib64/libz.so和/usr/lib64/libz.so.1是/usr/lib64/libz.so.1.2.7的軟鏈接。

救援模式的想法我沒有進一步驗證,知道怎麼出的錯,以後規避就是了。

假設我沒做rpm –nodeps -e zlib-1.2.7-18.el7.x86_64,千萬不能做

目前的需求就是升級zlib1.2.7到最新版zlib1.2.11

wget http://zlib.net/zlib-1.2.11.tar.gz

tar zxvf zlib-1.2.11.tar.gz

cd zlib-1.2.11

./configure –prefix=/usr/local/zlib

make

make check

make install

cp /usr/local/zlib/lib/libz.so.1.2.11 /usr/lib64/

mv /usr/lib64/libz.so.1.2.7 /usr/lib64/libz.so.1.2.7.bak

rm /usr/lib64/libz.so 如果報【rm: 無法刪除"/usr/lib64/libz.so": 沒有那個文件或目錄】請忽略繼續向下走

ln -s /usr/lib64/libz.so.1.2.11 /usr/lib64/libz.so

rm /usr/lib64/libz.so.1

ln -s /usr/lib64/libz.so.1.2.11 /usr/lib64/libz.so.1

echo "/usr/local/zlib/lib" >> /etc/ld.so.conf

最後執行ldconfig -v能看到libz.so.1 -> libz.so.1.2.11就代表成功了

然後再執行sh dotnet-install.sh就不報找不到zlib了

安裝好了,但是需要處理下環境變數

通過修改.bashrc文件:

vim ~/.bashrc

//在最後一行添上export PATH=/root/.dotnet:$PATH

生效方法(二選一):

①關閉當前終端窗口,重新打開一個新終端窗口就能生效

②輸入「source ~/.bashrc」命令,立即生效

有效期限:永久有效

用戶局限:僅對當前用戶

三、使用騰訊雲dotnet sdk

兩種辦法:

①git clone方式

yum install git -y

git clone https://github.com/TencentCloud/tencentcloud-sdk-dotnet.git

先解析一下目錄結構

TecentCloud.sln是解決方案,你可以打開看它的內容,包含了3個項目

真正的SDK其實就是TencentCloud目錄(項目),TecentCloudExamples、WindowsFormsApp這2個目錄分別是終端項目和窗體項目,我們在Linux命令行下調試的是TecentCloudExamples這個目錄,即console項目,裡面的例子程式碼調用的是上層目錄里的TencentCloud項目,所以你去看TecentCloudExamplesTecentCloudExamples.csproj的內容如下,中間那段就是引用,用的是2個..代表上層目錄,上層目錄里的TecentCloud項目

上圖3小段,第1段是必須的,需要根據實際情況寫版本號,第2段是git clone方式或直接下載壓縮包、解壓使用的方式的TencentCloud項目引用,第3段是NuGet方式獲取引用,是第1段+第2段還是第1段+第3段請根據實際情況來,我們壓縮包里TecentCloudExamplesTecentCloudExamples.csproj是3段都有,雖說不影響結果,但是是不嚴謹的。

由於我安裝的是3.1.102(執行dotnet –version查看),大版本是3.1,.csproj里netcoreapp後面是3.1

這裡我用的git clone方式、不是NuGet方式,所以我這裡是第1段+第2段,即

  <PropertyGroup>

    <OutputType>Exe</OutputType>

    <TargetFramework>netcoreapp3.1</TargetFramework>

  </PropertyGroup>

  <ItemGroup>

    <ProjectReference Include="..TencentCloudTencentCloud.csproj" />

  </ItemGroup>

下面正式開干:

在TecentCloudExamples的平級目錄(/root/tencentcloud-sdk-dotnet/)創建一個Test文件夾

mkdir Test

cd Test

dotnet new console

這樣終端項目就自動創建好了,如下圖

然後dotnet add reference ../TencentCloud/TencentCloud.csproj

然後cat Test.csproj查看如下

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>

    <OutputType>Exe</OutputType>

    <TargetFramework>netcoreapp3.1</TargetFramework>

  </PropertyGroup>

  <ItemGroup>

    <ProjectReference Include="..TencentCloudTencentCloud.csproj" />

  </ItemGroup>

然後vim Program.cs替換Program.cs的程式碼為api explorer里準備好的程式碼

https://console.cloud.tencent.com/api/explorer?Product=cdn&Version=2018-06-06&Action=DescribeCdnDomainLogs

secretid、secretkey是你部署cdn站點的帳號的雲api密鑰對,請注意安全,不要跟任何人分享你的雲api密鑰對

api explorer工具是個好東西,填好secretid、secretkey+3個必填參數(填你自己的cdn站點資訊),右邊自動生成程式碼

這裡只是以一個具體介面為例,你也可以選其他介面做實驗

操作過程如下圖

最後一步:

dotnet build

dotnet run

②NuGet方式

mkdir test

cd test

dotnet new console

dotnet add package TencentCloudSDK –version 3.0.45 //這一步自動實現引用,你不用管引用的東西在哪裡,反正這句命令給你處理好了,接下來你只需要關注自己的程式碼了,具體版本號請上Github 程式碼託管地址查看

查看包引用的命令:dotnet list package

刪除包引用的命令:dotnet remove package packagename 例如dotnet remove package TencentCloudSDK

然後vim Program.cs替換Program.cs的程式碼為api explorer里準備好的程式碼

然後dotnet build、dotnet run就可以了

這種方式簡單吧?

四、把終端程式碼變ASP.NET Core Web服務

1、把終端程式碼變ASP.NET Core Web服務的效果圖如下

2、查了很多資料,學到一個非常關鍵的點:–urls="url1;url2;url3;url4"後面再多url我就沒試了,感興趣的可以試試。

默認是監聽到http://localhost:5000和https://localhost:5001,通過–urls=可以修改監聽。

5000埠是http

5001埠是https

3、localhost證書最初是不受信任的,得做下處理:

參考:https://docs.microsoft.com/zh-cn/aspnet/core/security/enforcing-ssl?view=aspnetcore-3.1&tabs=visual-studio#trust

①運行certmgr.msc打開證書管理器,手動刪掉下圖紅色標記的2個localhost證書,請勿刪除 IIS Express localhost 證書(一共3個,是刪前2個,不是3個都刪

②執行命令重新安裝localhost證書並信任之

dotnet dev-certs https –clean

dotnet dev-certs https –trust

③運行程式碼,在瀏覽器里訪問https://localhost:5001看證書圖標是不是綠的

4、著重講下console程式碼如何變web程式碼

①下載vs2019社區版並安裝成功

②打開vs2019創建WebApplication空白項目,按默認路徑保存即可,項目路徑是C:UsersAdministratorSourceReposWebApplication1WebApplication1.csproj

cd /d "C:UsersAdministratorSourceReposWebApplication1WebApplication1"

③進到項目目錄,用NuGet方式安裝TecentCloud Package

安裝命令:dotnet add package TencentCloudSDK –version 3.0.45

這一步自動實現引用,你不用管引用的東西在哪裡,反正這句命令給你處理好了,接下來你只需要關注自己的程式碼了

此時用notepad++或記事本打開WebApplication1.csproj查看,多了

  <ItemGroup>

    <PackageReference Include="TencentCloudSDK" Version="3.0.45" />

  </ItemGroup>

④不需要改Program.cs,只改Startup.cs

我們再把try…catch…放大分析下

無非就是用相似語句進行功能替換,為了讓終端和網頁端都有調用介面的結果,我沒有注釋綠色划出的兩句,如果不需要終端顯示,綠色那2句可以注釋掉。

5、如果沒用NuGet方式,而是直接下載的壓縮包,那你得在解壓出來的目錄里建一個文件夾WebApplication2,這個文件夾跟TencentCloud目錄同級

cd tencentcloud-sdk-dotnet-master

mkdir WebApplication2

cd WebApplication2

dotnet new web

這樣就形成了這個路徑的文件tencentcloud-sdk-dotnet-masterWebApplication2WebApplication2.csproj

編輯WebApplication2.csproj如下圖

這裡明確說明下,ProjectReference Include是給下載壓縮包、解壓使用的方式用的(包括git clone)

  <ItemGroup>

    <ProjectReference Include="..TencentCloudTencentCloud.csproj" />

  </ItemGroup>

而PackageReference Include是給NuGet方式用的

  <ItemGroup>

    <PackageReference Include="TencentCloudSDK" Version="3.0.45" />

  </ItemGroup>

.csproj文件里PackageReference Include和ProjectReference Include只能二選一。