一、做足准备
【.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项目,所以你去看TecentCloudExamples\TecentCloudExamples.csproj的内容如下,中间那段就是引用,用的是2个..代表上层目录,上层目录里的TecentCloud项目
上图3小段,第1段是必须的,需要根据实际情况写版本号,第2段是git clone方式或直接下载压缩包、解压使用的方式的TencentCloud项目引用,第3段是NuGet方式获取引用,是第1段+第2段还是第1段+第3段请根据实际情况来,我们压缩包里TecentCloudExamples\TecentCloudExamples.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="..\TencentCloud\TencentCloud.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="..\TencentCloud\TencentCloud.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方式(windows、linux通用)
这里介绍3个命令,比如
①查看包的命令:dotnet list package
②安装包的命令:dotnet add package packagename 例如
dotnet add package TencentCloudSDK
dotnet add package RestSharp
③删除包的命令:dotnet remove package packagename 例如
dotnet remove package TencentCloudSDK
dotnet remove package RestSharp
介绍完命令后,需要执行下面的操作了:
mkdir test
cd test
dotnet new console
dotnet add package TencentCloudSDK --version 3.0.45 //这一步自动实现引用,你不用管引用的东西在哪里,反正这句命令给你处理好了,接下来你只需要关注自己的代码了,具体版本号请上Github 代码托管地址查看,也可以不加,不加的话默认就是最新
vim Program.cs替换Program.cs的代码为api explorer里准备好的代码
然后dotnet build、dotnet run就可以了
这种方式简单吧?
四、把终端代码变ASP.NET Core Web服务
配置nuget国内源
mkdir test
cd test
dotnet new console
dotnet add package TencentCloudSDK
接下来vim Program.cs替换Program.cs的代码为api explorer里准备好的代码
然后dotnet build、dotnet run就可以了,例如
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:\Users\Administrator\Source\Repos\WebApplication1\WebApplication1.csproj
cd /d "C:\Users\Administrator\Source\Repos\WebApplication1\WebApplication1"
③进到项目目录,用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只改Startup.cs(注意public class后面的名称,跟文件名匹配起来)
我们再把try…catch…放大分析下
无非就是用相似语句进行功能替换,为了让终端和网页端都有调用接口的结果,我没有注释绿色划出的两句,如果不需要终端显示,绿色那2句可以注释掉。
5、如果没用NuGet方式,而是直接下载的压缩包,那你得在解压出来的目录里建一个文件夹WebApplication2,这个文件夹跟TencentCloud目录同级
cd tencentcloud-sdk-dotnet-master
mkdir WebApplication2
cd WebApplication2
dotnet new web
这样就形成了这个路径的文件tencentcloud-sdk-dotnet-master\WebApplication2\WebApplication2.csproj
编辑WebApplication2.csproj如下图
这里明确说明下,ProjectReference Include是给下载压缩包、解压使用的方式用的(包括git clone)
<ItemGroup>
<ProjectReference Include="..\TencentCloud\TencentCloud.csproj" />
</ItemGroup>
而PackageReference Include是给NuGet方式用的
<ItemGroup>
<PackageReference Include="TencentCloudSDK" Version="3.0.45" />
</ItemGroup>
.csproj文件里PackageReference Include和ProjectReference Include只能二选一。