程序员的知识教程库

网站首页 > 教程分享 正文

C# + .NET5 Web入门实战:私人笔记(6)打通任脉

henian88 2025-03-24 16:37:37 教程分享 23 ℃ 0 评论

上一节我们通过WebAPI接口读取到了分类数据,并能够在程序中呈现,这节我们完成从数据中的提取。

用C#平台来开发Web项目,数据库首选还是SQLServer。不过考虑这是入门教程,如果用SQLServer又牵涉到了相关的安装及配置,不便于演示,仍然还是沿用我们第一阶段使用的SQLite,相关代码也不需要重构了。

数据库连接

我们回顾下,在做Diary.Win的时候,我们用下面的语句就可以连接到数据库:

BAL.DBController.Default.connectToDatabase(Global.Default.DBFilepath);

只要有了数据库的文件地址就可以。在Diary.Win中,数据库的文件地址我们是这样获取的:

Global.Default.DBFilepath = string.Format("{0}{1}", Application.StartupPath, DBFilename);

然后我们尝试在Diary.WebAPI中也使用这样的代码,结果得到了这样的错误:

找不到Application的定义,大家可以先自行考虑为什么?

我们写程序的过程中就是不停地遇到问题,然后分析原因,解决问题。一个项目可以,一个项目不行,那肯定要先对比不同在哪里:

我们在Diary.Win项目中找到Application,因为这里是可以编译通过的。我们把鼠标移到Application的上面,Application一般是淡青色的,然后就会弹出这个类的释义。

我们可以看到,Application是定义在System.Windows.Forms这个命名空间下的。System.Windows.Forms是什么?是专门为WinForm程序定义的类库,只在WinForm程序下才能使用,因为WinForm的类库会直接调用Windows系统的API。而WebAPI是Web服务端程序,可能是Windows Server服务器,也可能是Liunx服务器或者其他操作系统,根本就没有WinForm程序得以依赖运行的环境,所以也就没办法支持Application这个类了。

那.net5是否存在一个与Application.StartupPath功能类似的类库或函数呢?当然是有的:
AppDomain.CurrentDomain.BaseDirectory 就是获得当前网站运行的根目录。

如下图,我们可以轻易地获得这个目录

但是从设计上考虑,这样并不好。主要是两点考虑:

1、多服务端共享

我们做的这个私人笔记是很简单的,无所谓多项目。大一点的项目管理后台与用户前台是分开的,甚至为了平衡负载,某些关键的、需要大量计算的接口会单独作为服务器来运行。而他们指向的数据库都是同一个甚至多个。如果你的数据库连接仅仅是在自己的项目中,那别人就没办法连了。

2、可维护性

网站项目不同于单机版。单机版就你一个人用,随时关随时停都没问题,有错误慢慢调。网站可能一直都有人在用,如果是写死在代码中,就意味着如果再修改,就要重新编译然后替换,有的时候你无法确定编译后会发生什么。这种事情对网站来说,越少发生越好,能通过改配置实现的,尽量不重新编译。


正确的方法是什么呢?当然是通过配置文件来定义。我们在解决方案目录中找到appsettings.json文件,然后增加:

在Startup.cs文件中读取配置:

这样就可以通过配置文件来定义数据库的路径,如果以后想要修改就直接改配置文件,网站不需要重新编译,只要重启服务就好了。

然后我们把Diary.db文件复制到网站目录,尝试运行,发现并没有成功。调试代码发现DBConnection中的中文字符竟然成了乱码,初步判断就是文件编码的问题。这种以前在做VC开发的时候太常见了,用C#开发以后少了很多。

我们用windows记事本打开appsettings.json,然后另存为时,果不其然,发现编码为ANSI

也就是说,默认生成的appsettings.json编码格式为ANSI,而读取的时候默认是按Utf-8,这个坑实在是太低级了。

记事本中在保持的时候改成UTF-8,再次运行,数据连接就成功了。

我们接下来就尝试在api接口中,从数据库返回真正的数据。

修改成红线部分的代码,然后运行:

成功读取数据。

至此,我们完成了数据从数据库->WebAPI->WASM->浏览器的呈现。相比WinForm,这个过程太漫长了。而如果我们Web采用的是Blazor Server的方式,也可以减少WebAPI的这一环节。那么是不是说WASM这种方式开发低效呢?对小项目来说确实是这样的,每个功能都要多出2-3个步骤,没有跨平台计划的,还是考虑用Blazor Server的方式吧。

如果放眼到跨平台的原生支持,上面的这些工作就不白做了。有了WebAPI作为中介,我们前端的处理就只关心界面和数据就好了,跨平台不再是问题,不同界面做不同的事情,Web也不过是其中的一种展现形式,这种方式可以让系统变得更宽。

打通了任脉后,我们接下来需要打通督脉,即把数据由浏览器写入到数据库中,下节继续。

----------------------------------------------------

本教程项目源码已作为开源项目加入到Gitee,代码内容会随教程实时更新,大家有兴趣的话可以关注我,以获得最及时的更新。私信:

私人日记 可以获取相关链接;

大家阅读过程中有哪些看不懂或未尽兴的地方,可以在评论区留言,我会先记下来在后续的教程中找机会再说。

教程有帮助的话请大家帮忙关注、转发、扩散,能不能开专栏还需要你们的支持!

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表