以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只能二选一。