SQL Server 2025 AI相关能力初探 - CareySon - 博客园

mikel阅读(402)

来源: SQL Server 2025 AI相关能力初探 – CareySon – 博客园

SQL Server 在2024年11月开始进行社区私有预览(链接),由于涉及AI能力,我也是第一时间申请了内侧资格,悲剧的是,直到2025年2月,才拿到预览版的测试资格-.-,此时已经是CTP1.3了,也就是内侧的第四个版本了。

但whatever,late better than never。下面根据我的初步测试,做一些分享。

当前的测试的版本为:

 

原生向量支持与DiskANN向量索引

SQL Server作为一个典型的商业数据库,一直喜欢搞大而全,各种全家桶全塞进来,现在流行的说法叫“一站式”。基本逻辑是每个SQL server版本都会结合当时流行的趋势和技术,将该技术集成进SQL Server,下面是一个简单的回顾

 

历代SQL Server结合当时背景的新增功能分析

SQL Server 2008 – 层级结构 (HierarchyID) 和地理信息 (Spatial Data):

 Web 2.0 兴起,层级数据和位置服务应用普及。HierarchyID 高效管理组织结构等层级数据,Spatial Data 支持位置服务,满足 Web 2.0 时代对复杂数据管理和地理位置应用的需求。

 

SQL Server 2012 – 内存数据库 (In-Memory OLTP):

电商等高并发 OLTP 应用爆发,磁盘 I/O 成性能瓶颈。另外这个时代SSD还是贵的没边,稳定性还没这么靠谱的存储。内存优化表 减少磁盘 I/O,大幅提升高并发 OLTP 性能,应对电商、金融等对极致性能的迫切需求。

但目前来看,这个功能使用率并不是很高,该功能通常通过外挂的缓存系统实现,比如Redis。

 

SQL Server 2014 – 列存储 (Columnstore):

大数据分析兴起,传统行式存储分析查询效率低下。列式索引优化分析查询,大幅提升大数据仓库性能,顺应大数据分析流行趋势,满足企业数据洞察需求。

 

SQL Server 2016 – JSON 支持 (JSON Support):

Web 服务和 NoSQL 流行,JSON 成 Web 数据交换主流格式。JSON 支持 允许存储和查询 JSON 数据,灵活适应 Web 服务和半结构化数据,拥抱 NoSQL 趋势,拓展应用场景。

 

SQL Server 2017 – 图数据库 (Graph Database):

社交网络、推荐系统等关系复杂应用兴起,传统关系数据库效率不高。图数据库 支持建模复杂关系,高效处理社交网络、推荐系统等应用。

 

SQL Server 2019 – HTAP (Hybrid Transactional/Analytical Processing):

实时数据分析需求强烈,传统数据仓库延迟高。HTAP 能力 支持实时分析,提升决策效率,符合实时业务监控和快速决策需求,顺应混合处理趋势。

 

SQL Server 2022 – 账本 (Ledger Tables):

数据安全和合规性日益重要,区块链技术火的一塌糊涂(比特币价格起飞),需要防篡改数据记录。账本表 提供防篡改数据记录,增强数据完整性和可信度,满足审计、合规等对数据可信有高要求的场景,拥抱区块链技术,提升数据安全水平。

 

SQL Server 2025 – 向量数据库 (Vector Database):

当下AI的爆发年代来看,需要向量数据库的背景无需多说,向量数据库在应用层面主要用于RAG、语义理解、大规模向量数据处理和多模态融合,并能显著降低向量检索计算成本。是AI应用中最重要的基础设施之一。

 

原生向量类型支持

SQL Server增加内置的Vector字段,最高支持1998维度(猜想是因为每个向量都是32精度的float,1998维度正好不超过SQL Server每页的8K存储,从而不溢出),通过测试可以发现,内部存储使用varbinary数据作为底层数据,做了一个简单的测试,通过新增变量类型为Vector,或表列定义为Vector列实现,如图所示:

 

基于DiskANN的向量相似度检索

DiskANN介绍

DiskANN基于微软2019年发表的论文《DiskANN: Fast Accurate Billion-point Nearest Neighbor Search on a Single Node》。在此之前,向量搜索领域中一个流行的主要算法是HNSW(分层可导航小世界图),这是一种利用多层图结构进行搜索的算法。HNSW的核心特点是涉及大量的随机内存访问,因此该算法需要消耗大量内存资源,要求原始向量和图数据都必须常驻内存中。

图.HNSW图查找示例

 

我们以阿里云的Millivs托管服务为例,如果涉及1千万的512维向量数据为例,推荐资源如下:

图. Millivs对于千万级512维向量的推荐资源

 

这种资源要求所带来的成本较高,会比较多限制AI的落地。针对于此,DisnANN的核心目标是,用有限的内存(几十GB)+大容量的SSD盘,支撑单节点存储和搜索十亿级别的数据集,同时保持高性能(低延迟、高召回率)。

DiskANN的核心算法是Vamana图,本质上是一种构建近似最近邻图的方法,它为每个节点构建一个有限数量的出边,这些出边连接到该节点的近似最近邻。与HNSW的多层结构不同,Vamana构建单层图,但通过精心设计的图构建过程确保搜索效率。举个例子理解是Vamana图就像一张城市地图,每个数据点是地图上的一个地点,边代表地点之间的邻近关系。DiskANN 的搜索过程就像在地图上导航,从某个起始点出发,沿着边不断“走”到离目标地点最近的位置。

同时DiskANN还做了一些优化,来适应磁盘换内存的场景,例如:

  • k-means聚类(分而治之),降低建图的内存需求。
  • PQ量化(数据压缩),减少内存和计算量。
  • SSD定长数据(高效存储),加速读取。
  • 入口节点和邻居放内存(缓存热点),减少SSD访问。
  • beam-search(并行搜索),提升搜索效率。

 下面是根据论文,做了一个DiskANN的简单数据:

 

SQL Server中相似度搜索使用方式

当前在SQL Server的CTP1.3版本中,向量搜索的核心函数主要是VECTOR_DISTENCE,可以结合在传统的T-SQL中使用,目前该函数还比较初级,当前仅支持余弦相似度、欧式距离和点积。一个简单的示例如下:

-- 创建一个包含向量字段的表
CREATE TABLE VectorTable (
    ID INT PRIMARY KEY IDENTITY(1,1),
    Description NVARCHAR(100),
    EmbeddingVector VECTOR(10) -- 创建10维向量字段
);

INSERT INTO VectorTable (Description, EmbeddingVector)
VALUES 
    ('示例项目1', '[0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]'),
    ('示例项目2', '[0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5]'),
    ('示例项目3', '[0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0.0]');


DECLARE @queryVector VECTOR(10) = '[0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 0.1]';



-- 使用余弦相似度查找最相似的向量
SELECT 
    ID, 
    Description,
    vector_distance('cosine' , @queryVector, EmbeddingVector)
FROM VectorTable

余弦相似度的结果如下:

图. 计算余弦相似度

 

同时SQL Server也支持使用和传统的关系数据共同作用,进行相似度查询,例如该例子,结合where条件,帮助用户通过where做过滤,同时选出top 5相似度的产品:

  -- 假设我们有一个查询向量(可能来自用户当前正在查看的产品)
DECLARE @query_vector VECTOR(512) = CAST(CONCAT('[', REPLICATE('0.15,', 511), '0.15]') AS VECTOR(512));

-- 查找与当前产品最相似的5个产品(使用余弦相似度)
SELECT top 5
    id,
    category,
    description,
    vector_distance('cosine' , @query_vector, vector) AS similarity_score
FROM 
    VectorDemo
where category = 'Clothing'
ORDER BY 
    similarity_score

结果如下:

图.余弦相似度计算结果

 

相似度搜索的性能

由于当前我拿到的是私有预览版的sql server,并没有合适的帮助文档,因此不确定我的使用方式是否正确,按我的理解,可能需要针对向量列单独加索引,但目前没看到加索引的方式,下面的测试是基于没有加索引的测试。测试的数据量如下:

当前我们的测试表大约是200W+的数据,每列包含512维的向量,大约数据占用是6G左右,当我做一个简单的相似度搜索时,可以看到

 

虽然查询完成时间在334毫秒,从逻辑读(80万的逻辑读*8K每次读取,基本等于数据量大小)来看,基本走了全表扫描,而CPU使用也是非常高,基本需要1个CPU 100%,2.3S时间。

当前查询完成快是数据已经常驻内存,那么如果我将sql server使用内存调低,涉及到IO读写呢?比如当前数据量维6.9G,我将内存使用上限调整为6G会发生什么:

 

由于开始涉及物理读写,我们看到整个查询时间来到不可接受的节奏。大量的预读和IO操作使得CPU时间翻倍,同时整体时间增长50倍倍。

那么我们使用选择性很高的索引呢?

 

可以看到,category=’test’的选择性非常高,导致向量相似度搜索成本直接通过IndexSeek+向量搜索完成。

后续等待更多文档出来再进一步观察,当前的观察是,如果没有对向量增加索引,则搜索基本需要全量比对+排序。如果用于实际生产,基本难以接受。

 

其他AI相关函数支持

VECTOR_NORM(向量标准化)

本例中VECTOR_NORM(image_embedding, ‘norm2’) > 3 主要作用:

  • 去除纯色背景(因向量范数接近零)
  • 去除模糊图像(因特征信息少,范数较小)
  • 去除异常数据(因数据录入错误,导致范数极小或无效)

 

 VECTOR_NORMALIZE(向量归一化)

该函数解释也比较简单,就是将向量的上限变为1,比如当前最大值是5,则对应的4变为0.8。一个简单的例子:

 

 

 

AI服务集成与T-SQL扩展

sp_invoke_external_rest_endpoint

直接通过 T-SQL 调用外部的 HTTPS REST 或 GraphQL 接口。简单来说,它让 SQL Server 数据库可以像客户端一样,直接和外部服务(比如 Azure Functions、Power BI、OpenAI API 、DeepSeek API等)交互。

想象你在 SQL Server 里写了个脚本,但需要外部服务(比如翻译文本、计算汇率、调用大模型等)。以前你得写个外部程序(比如用 Python 或 C#)去调用服务,再把结果写回数据库。现在,sp_invoke_external_rest_endpoint 可以做到数据不出数据库即可完成服务。

其实外部调用的优势和劣势我也简单做了一个总结,

优势:

  • 数据就地处理,减少数据搬运(同时减少安全面)
  • 统一的事务与安全机制(ACID支持,数据库权限、证书支持)
  • 简化架构与减少依赖(集中化带来开发便利)
  • 方便运维(集中化带来运维便利)
  • 快速原型验证(验证后迁移服务层)

  劣势:

  • 数据库负载与性能冲突
  • 数据库难以Scale-out
  • 难以调试(T-SQL相比编程语言难以调试)
  • 语言/生态局限(支持的Python包有限)
  • 安全问题(需要数据库能够访问外部服务,需要额外启用防火墙)
  • 数据库中生态极差(主流语言支持丰富的AI/ML库)

 

下面是一个简单的例子,我将SQL Server数据库的日志发送给大模型,寻求性能优化建议:

 

DECLARE 
    @endpoint_url NVARCHAR(200) = N'https://',
    @api_key NVARCHAR(100) = N'sk-or-v1',
    @logs_context NVARCHAR(MAX),
    @payload NVARCHAR(MAX),
    @response_status_code INT,
    @response_message NVARCHAR(MAX);

-- 步骤1:获取最新的 SQL Server 日志信息作为上下文
SET @logs_context = N'2025-02-26 14:35:15.45 spid51 Query execution time exceeded 1s for SELECT * FROM Sales.Orders JOIN Sales.OrderDetails ON Orders.OrderID = OrderDetails.OrderID WHERE OrderDate > ''2025-01-01''. Table scan detected on Sales.OrderDetails due to missing index on OrderID. + 2025-02-26 14:35:18.19 spid47 CPU usage reached 92% for 30 seconds. High lock contention detected on table Sales.Orders. + 2025-02-26 14:35:19.19 spid47 Buffer pool hit ratio dropped to 7%. Memory pressure detected, available memory: 512 MB.';

-- 步骤2:构造请求体
SET @payload = N'{
    "model": "google/gemini-2.0-flash-001",
    "messages": [
        {"role": "system", "content": "You are a SQL Server expert."},
        {"role": "user", "content": "以下是我的SQL服务器日志信息:' 
         + @logs_context 
         + N'。请给出可能的性能优化或故障排查建议。"}
    ]
}';

-- 步骤3:构造请求头
DECLARE @headers NVARCHAR(MAX);
SET @headers = CONCAT(N'{"Content-Type": "application/json", "Authorization": "Bearer ', @api_key, '"}');

-- 步骤3:调用 sp_invoke_external_rest_endpoint 发送 POST 请求
EXEC sp_invoke_external_rest_endpoint
     @url = @endpoint_url,
     @payload = @payload,
     @method = 'POST',
     @headers = @headers,
     @response = @response_message OUTPUT,
     @timeout = 60; 

-- 步骤5:查看返回结果
SELECT @response_message AS [OpenRouter Response];

看到结果:

图. 调用外部模型返回的结果

返回的部分JSON截图:

图. 部分返回结果JSON化

sp_execute_external_script

在使用库数据库层直接完成推理或特征提取,sp_execute_external_script是 SQL Server 提供的一个系统存储过程,允许在 SQL Server 中直接执行外部脚本语言(如 R、Python 或 Java)的代码,并且可以与数据库中的数据无缝交互。它是 SQL Server 集成机器学习和高级分析能力的核心组件之一。

 

一个简单的例子:调用 Python + Hugging Face Transformer 做情感分析

图. 使用T-SQL调用外部Python包

 

结果:

图. 情感分析场景结果

支持 LangChain、Semantic Kernel、EF 等流行 AI 框架

这部分是在SQL Server之外完成的,本质上就是在这些流行的框架中,增加了对SQL Server的驱动支持,其实没什么好说的,例如:

 

在langchain中,直接支持SQL Server作为数据存储。

图. 将SQL Server作为向量数据源

 

直接在langchain中进行相似度搜索

图. SDK直接进行相似度搜索

图. 在C#的ORM直接支持相似度搜索

 

小结

  本文基于SQL Server 2024年11月社区私有预览(CTP1.3版本)的初步测试,分享了新功能的体验。SQL Server 2025新增了原生向量支持和DiskANN向量索引,适应当前AI应用需求,可用于RAG、语义理解等场景,支持最高1998维向量存储及余弦、欧氏距离等相似度检索。测试中发现,向量搜索性能可能因缺乏索引或数据未驻留内存而下降,特别是在IO密集场景下表现不理想,但这可能与测试时缺乏官方文档、使用方法不当有关,待后续资料完善后再进一步验证。此外,新功能还包括向量标准化

   通过sp_invoke_external_rest_endpoint和sp_execute_external_script实现外部服务调用和脚本执行,扩展了应用场景,但也带来了一些性能和调试上的挑战。同时,SQL Server对LangChain、Semantic Kernel等框架的支持也增强了其生态兼容性。总的来说,SQL Server 2025在功能整合上迈出了重要一步,但实际效果还有待更多文档支持和优化验证。

全程不用写代码,我用AI程序员写了一个飞机大战 - 北京-宏哥 - 博客园

mikel阅读(247)

来源: 全程不用写代码,我用AI程序员写了一个飞机大战 – 北京-宏哥 – 博客园

前言

还在为写代码薅头发吗?还在为给出的需求无处下手而发愁吗?今天宏哥分享一款开发工具的插件,让你以后的编程变得简单起来。 作为一个游戏编程小白,能完成自己工作就不错了,还能玩别的,这在以前想都不敢想,现在就可以轻松实现了。来跟随宏观的脚步,通过简单几步成功开发出了一款飞机大战小游戏! 是的,你没听错,就是那种你可以控制一架小飞机,在屏幕上闪躲子弹,击败敌人的游戏。听起来是不是很酷呢!

1.环境准备

1.1操作系统

1.宏哥的环境是Windows 11版本 64位系统(32位的同学自己想办法哦,当然了现在32位的一般很少见),如下图所示:

1.2Python版本

Python版本:python:3.7.2,如下图所示:

1.3IDE开发工具

1.PyCharm 2021.3.3开发平台,如下图所示:

1.4 AI工具

1.通义灵码插件。

2.资源准备

链接:资源下载 提取码:n8ey ,就是游戏需要的一些图片和音频文件,如下图所示:

3.安装AI插件

1.首先是安装通义灵码,直接在pycharm的文件(File)下拉菜单中选择选项(Settings),如下图所示:

2.点击“选项(Settings)”后,在对话框中选择插件(plugin)在此界面上面的搜索框中,输入tongyi,就出来了,如下图所示:

3.已经安装上了,显示的是installed,没安装就是绿色的install,点击后,稍等一会,即可完成安装。如下图所示:

4.安装好以后,要想使用就得登录,点击“登录”,如下图所示:

5.一般注册过社区的,直接登录社区账号,然后通义灵码就会单点登录成功,很方便的,如下图所示:

6.通义灵码插件登录成功,如下图所示:

7.点击右下角图标,点击“高级设置”,可以根据自己癖好进行一些设置,如下图所示:

8.点击右侧的“通义灵码”,可以弹出AI对话框,点击“智能问答”和“AI程序员”进行切换,也可以点击最下边的下拉按钮切换大模型(qwen-2.5,deepseek-v3,deepseek-r1),如下图所示:

好了,到此一切准备工作就绪,下边就开始游戏编程之旅。

4.开启游戏编程之旅

4.1AI程序员交互过程

1.写出你的需求,发送给AI程序员,提示词如下:

生成飞机大战游戏完整代码,用pygame运行,记得不是简单的游戏框架代码哦,而是完整代码,利用飞机大战文件夹中的游戏素材: bullte.svg(子弹图), enemy.svg(敌机图),explosion.svg(爆炸素材图)、player.svg(我方机图)、sound.wav(子弹声音)、background_music.mp3(背景音乐),如下图所示:

2.好家伙一口气给我生成这么多,一气呵成啊,那我接下来点击“接受”,如下图所示:

3.点击“接受”后,自动创建python代码文件,如下图所示:

4.2AI程序员解决bug

1.运行代码出错,直接复制错误丢给AI程序员,帮你直接解决bug,如下图所示:

2.从上图我们可以看到,AI程序员直接定位到有问题代码的地方,同时给出了解决方案 :检查是否有未安装的模块,如何有,则通过命令进行安装,如果你觉得没有问题,点击“接受”就可以了,如下图所示:

3.再次运行修改后代码,控制台可以看到,在安装缺少的pygame模块,如下图所示:

4.稍等一会,安装完缺少的模块,代码运行成功,出现飞机大战的游戏界面(键盘方向键左右移动我放飞机,空格键发射子弹),如下图所示:

4.3AI程序员完善代码

1.实际运行中交互效果问题,直接向AI程序员提问,帮你完善。比如我遇到的问题:”子弹不跟着飞机移动”,给出的修复代码直接采用即可!如下图所示:

4.4AI程序员解决新需求

1.当然我们也可以通过AI程序员不断地完善我们游戏的需求如下:

(1)增加玩家命的概念,几条命就能继续玩几次,而不是直接退出。如下图所示:

(2)一条生命结束并重新开始时,要有5秒的无敌时间,如下图所示:

(3)增加紧张的背景音乐,如下图所示:

(4)增加积分功能,每打掉一个敌人增加一分,如下图所示:

2.按照以上需求,我们将这4条需求喂给AI程序员,它会自动将需求转换成代码,你可以傻瓜式的接受即可,完成以上需求后,运行代码后游戏界面,如下图所示:

4.5AI程序员代码优化

1.整体运行正常后,看着代码一大坨太难受,我们就让AI程序员这个老司机帮我们优化下,如下图所示:

4.6AI程序员编写单元测试

1.当然,你也可以让AI程序员编写单元测试,来验证代码的健壮性!解释代码,帮助你学习代码!生成注释,提高代码的可读性。如下图所示:

4.7AI打包成可执行文件

1.如何想打成exe软件直接运行,直接问AI程序员,他会详细告诉你每一步!提示词:“如何把程序打成.exe”,如下图所示:

5.个人愚见

5.1输出结果不稳定

1.由于时间关系,文章一天没有写完,第二天再次互动同样的提示词,结果却不一样,如下图所示:

2.运行代码,结果如下:

5.2提示词的准确理解

1.宏哥的那个提示词,没有说到背景图片,结果代码里有,然后运行代码提示我缺少背景图片,如下图所示:

5.3响应时间慢

1.在使用AI程序员的时候,添加提示词后,切换不同的模型,明显感觉deepseek的响应比qwen-2.5的速度慢,但总体感觉速度都不是很快(生成中,一直在转圈),如下图所示:

✨通过这次体验,大家是否感受到AI的强大和便捷。无论你是编程新手还是有经验的开发者,AI程序员都能为你提供极大的帮助,提升你的开发效率。希望这次分享能激发更多人尝试编程,感受创造的乐趣!赶快动手试试吧,说不定你也能轻松开发出属于自己的游戏哦!(为了增加趣味性,我就不附件代码了!自己体验吧)

6.使用感受

1.上边说了一些使用过程中的不足,下边再夸一下,最重要的是:免费,免费无敌,呵呵!

2.体验亮点‌:

  1. ‌代码智能生成‌:快速生成高质量代码,显著缩短开发周期。
  2. ‌跨语言编程‌:轻松实现代码跨语言转换,打破语言壁垒。
  3. ‌单元测试生成‌:自动生成测试用例,提升代码可靠性。
  4. ‌研发智能问答‌:即时解答技术难题,提高开发效率。

‌3.体验感受‌:

通义灵码2.0作为AI编程助手,功能强大且易用。在新功能开发、跨语言编程等场景下表现出色,显著提升了开发效率和代码质量。

‌建议‌:

  • 进一步优化代码生成风格和安全性。
  • 增加对更多编程语言的支持。
  • 提高响应时间和对提示词理解
  • 提示互动结果的稳定性

‌总结‌:

通义灵码2.0的AI程序员是一款值得推荐的智能编码搭子,为开发者带来高效、便捷的编程体验。期待未来更多创新功能。

展开说说关于C#中ORM框架的用法! - chen西瓜 - 博客园

mikel阅读(294)

来源: 展开说说关于C#中ORM框架的用法! – chen西瓜 – 博客园

1. Entity Framework 6 (EF6)

EF6 是较早的版本,主要针对.NET Framework设计,支持.NET Framework 4.5及以上版本。它在.NET Framework环境中非常成熟和稳定。

特点

  1. 成熟度高:
    • EF6 是.NET Framework环境中非常成熟的ORM框架,支持广泛的数据库操作。
    • 提供了丰富的功能,如代码优先、数据库优先、模型优先等开发方式。
  2. 支持.NET Framework:
    • 专为.NET Framework设计,与.NET Framework环境高度集成。
    • 适用于基于.NET Framework的桌面应用、Web应用等。
  3. 功能丰富:
    • 支持复杂的映射关系(如继承、多对多关系等)。
    • 提供了强大的数据库迁移功能(Code First Migrations)。
  4. 性能优化:
    • 虽然性能不如EF Core,但在.NET Framework环境中已经经过了大量优化。

适用场景

  • 如果你的项目基于.NET Framework,或者需要与现有的.NET Framework代码库集成,EF6是一个不错的选择。
  • 适用于需要快速开发且对性能要求不极端的场景。

2. Entity Framework Core (EF Core)

EF Core 是微软为.NET Core和.NET 5+(包括.NET 6、.NET 7等)环境重新设计的ORM框架。它是EF6的下一代版本,专注于高性能、轻量级和跨平台支持。

特点

  1. 高性能:
    • EF Core在性能上进行了大量优化,特别是在处理大量数据时,性能表现优于EF6。
    • 提供了更高效的查询编译和缓存机制。
  2. 跨平台支持:
    • EF Core支持.NET Core和.NET 5+,适用于跨平台开发(Windows、Linux、macOS)。
    • 与现代的.NET生态系统(如ASP.NET Core)无缝集成。
  3. 轻量级和模块化:
    • EF Core的设计更加轻量级,去掉了EF6中一些冗余的功能。
    • 提供了模块化的扩展机制,可以根据需要加载特定的功能。
  4. 强大的新特性:
    • 支持异步编程(async/await)。
    • 提供了更灵活的配置方式(如Fluent API)。
    • 改进了数据库迁移工具(dotnet ef命令行工具)。
  5. 持续更新:
    • EF Core是微软重点发展的ORM框架,会持续获得更新和改进。

适用场景

  • 如果你的项目基于.NET Core或.NET 5+,推荐使用EF Core。
  • 对性能要求较高的场景(如高并发Web应用)。
  • 需要跨平台支持的项目。

版本对比总结

特性 Entity Framework 6 (EF6) Entity Framework Core (EF Core)
目标框架 .NET Framework .NET Core / .NET 5+
性能 较好,但不如EF Core 高性能,优化显著
跨平台支持 不支持 支持(Windows、Linux、macOS)
功能丰富度 功能丰富,但较重 轻量级,模块化
更新与支持 维护更新较少 持续更新,重点发展
适用场景 .NET Framework项目 .NET Core / .NET 5+项目

选择建议

  1. 如果你的项目基于.NET Framework:
    • 使用EF6,因为它与.NET Framework高度集成,功能成熟。
  2. 如果你的项目基于.NET Core或.NET 5+:
    • 使用EF Core,因为它性能更好、支持跨平台,并且是微软重点发展的方向。
  3. 如果你需要高性能:
    • EF Core是更好的选择,尤其是在处理高并发和大数据量时。
  4. 如果你需要快速开发且对性能要求不高:
    • EF6仍然是一个不错的选择,尤其是对于简单的桌面应用或Web应用。

高阶玩法:Coze+DeepSeek打造一站式视频制作工作流(建议收藏)

mikel阅读(1690)

来源: 高阶玩法:Coze+DeepSeek打造一站式视频制作工作流(建议收藏)

最近在研究使用Coze工作流制作视频,虽然其官方支持的视频插件有限,但合理组合使用,也能覆盖不少我们的应用场景。

比如下面这个账号,其主要分享认知思维的内容。以口播的方式直接阐述认知观点。搭配简洁的背景和深度的解读,总能吸引人停留关注。

图片

小红书主页案例:

图片

那是否可以利用Coze,实现一站式视频生成的工作流呢?

试一下不就知道了?

图片
图片

账号拆解

我们可以直接将账号截图丢给DeepSeek-R1模型,让其先进行深度分析和拆解

图片

参考DeepSeek的分析结果,可以确定制作此类视频的关键信息,为后续工作流搭建理清思路。

信息要素,(风格、标题、作者、极简头像、左右子标题、分段字幕、磁性配音)

图片

细节前置

  • 考虑视频的长度在3~4分钟,控制Coze工作流执行时间避免超时。
  • 视频制作耗时较长,需要异步完成,需找到合适的视频插件。
  • 配音需要沉稳、磁性,需选择合适的音频插件。
图片

工作流分解

  1. 文章内容:大模型生成内容或直接使用用户输入的文章内容。
    1. 文章生成我们可以使用DeepSeek-R1模型,生文质量非常高。
    2. 同样也可以使用Coze内置的免费模型,基本够用。
  2. 字幕拆分:根据标点符号进行断句拆分,避免字幕内容过长。
  3. 批量制作图片:利用画板+批处理节点搭建图片制作流程
  4. 音频制作:利用音频插件,为每句话单独生成音频文件,和图片字幕相匹配
  5. 图片音频转视频:聚合图片和音频文件,
  6. 压缩视频片段生成长视频文件。

以上是这套工作流的细节和核心制作逻辑。

图片

文章预处理+拆分句子

图片
图片

批处理+画板,批量生图

图片
图片

音色选择+生成音频

图片
图片

图片+音频生成视频片段

图片
图片

聚合视频片段

最后聚合视频片段,转换为完整的长视频素材

图片

看下生成视频,满足预期效果。

进度条,百分之13

实测下来,整个视频制作约3~5min,极大提高了创作效率。

此工作流暂未上架,其中涉及的细节及插件使用方式,后续会在学习群中分享。

以上,如果觉得有用还请点赞关注支持。

下面是我的AI共学群,主要分享AI产品、智能体应用等内容,感兴趣的欢迎关注交流。

分享4款.NET开源、免费、实用的商城系统 - 追逐时光者 - 博客园

mikel阅读(524)

来源: 分享4款.NET开源、免费、实用的商城系统 – 追逐时光者 – 博客园

前言

今天大姚给大家分享4款.NET开源、免费、实用的商城系统,希望可以帮助到有商城系统开发需求的同学。

nopCommerce

nopCommerce是一个.NET开源功能丰富、免费、灵活且可定制的开源电子商务解决方案(大家假如有商城需求可以直接使用该项目进行二次开发,省时省力) ,具备商城该有的各种功能和特性。

CoreShop

CoreShop完整开源、无封装无加密、商用免费、支持跨平台、多数据库支持,基于 ASP.NET 8.0、Uni-App开发、支持可视化布局的商城系统;前后端分离,支持跨平台运行;拥有分销、代理、团购秒杀、接龙、拼团、直播、优惠券、自定义表单等众多营销功能;支持一键发布到微信小程序、H5、安卓APP、苹果APP。

 

eShop

eShop基于.NET 9构建,并集成了.NET Aspire、Blazor、Azure OpenAI等先进技术,数据库采用 PostgreSQL,缓存采用 Redis,客户端支持网页版本、iOS 版本和安卓版本,为开发者提供了一个学习和实践的平台。此外,项目还提供了详细的运行和部署指南,以及示例产品数据和AI集成,帮助开发者更好地理解和应用这些技术。

 

Module Shop

Module Shop是一个基于.NET Core构建的简单、跨平台、模块化、完全开源免费(MIT License)的商城系统。

优秀项目和框架精选

以上项目都已收录到C#/.NET/.NET Core优秀项目和框架精选中,关注优秀项目和框架精选能让你及时了解C#、.NET和.NET Core领域的最新动态和最佳实践,提高开发工作效率和质量。坑已挖,欢迎大家踊跃提交PR推荐或自荐(让优秀的项目和框架不被埋没🤞)。

探究高空视频全景AR技术的实现原理 - charlee44 - 博客园

mikel阅读(322)

来源: 探究高空视频全景AR技术的实现原理 – charlee44 – 博客园

1. 引言

笔者认为现阶段AR技术的应用是还是比较坑爹的,大都是噱头多但是实用的成分少,拿出来做做DEMO是可以,但是难以在实际的项目中落地产生实际的经济价值。一方面是很难在业务上难以找到合适的应用场景(可能管线相关的项目算一个),另一方面技术上也存在一些难以突破的问题。不管是手持设备还是AR眼镜,这些比较适合AR的硬件性能还是太弱了,导致其重建的空间信息与现实部分的空间信息存在较大的差距,这样的话就谈不上对现实的增强了。

不过笔者最近遇到了一个高空视频全景AR的项目,感觉具有不错的应用价值。具体可以参看这个案例:【数智实践】AR云景全局掌控,为园区装上“智慧之眼”,其中一张操作演示的的动态图如下:

图1 高空视频全景AR项目演示图

这个案例看起来与我们经常碰到的AR应用有所不同,不过笔者认为尽管这个案例可能没有用到像AR Core/AR Kit这样的AR组件,也不是这些组件提供的功能点,但也是AR技术的应用案例。所谓AR(Augmented Reality,增强现实),指的就是虚实结合,以达到对现实增强的效果。在这个案例中,“实”的部分就是高空摄像头视频画面,“虚”的部分就是点的地理位置标注;更关键的地方在于,这些注记随着摄像头画面的移动和缩放而移动,并不是固定在某个像素位置。从GIS的角度上来看,这似乎在操作一张地图,这张地图还是动态的。

在AR Core中,像这样的功能被称为运动追踪,通常通过SLAM(simultaneous localization and mapping,实时定位和地图构建)技术来实现。SLAM主要解决这样的问题:一个机器人在未知环境中,通过计算机视觉等技术让机器人知道自己的具体位置,进而描绘出此环境完全的地图。但是笔者认为这个案例中应该用不到这种比较复杂的技术,基础的GIS+测绘+计算机视觉技术足应该以实现这种效果。

2. 详论

需要实现声明的是,由于高空视频全景AR的案例需要很多硬件上的操作和支持,笔者并没有条件具体实现其中的功能,更多的是从理论上探究其中的实现原理,如果哪里说的不太对,也请读者进行斧正。

2.1 静止画面

首先将这个问题简化成最基本的场景,也就是无操作画面静止的情况(不是画面中的视频不会动,指的是拍摄的位置不会变化)。在这种情况下,注记实际代表的地理位置(物方坐标)是不会变化的,像素的位置(相方坐标)也不会变化,那么我们只需要关心注记的位置如何投射到视频画面中。很显然,这个过程与相机标定的过程非常相似,已知一组点的物方坐标和像方坐标,那么可以标定出相机的内参和外参。具体可以参考笔者的这篇文章《一次实践:给自己的手机摄像头进行相机标定》

在这个案例中,物方坐标可以通过GPS采集得到。不过GPS采集的点是WGS84地理坐标系的点。WGS84地理坐标系坐标是经纬度坐标,需要将其转换成笛卡尔坐标,也就是ECEF(地心地固直角坐标系)坐标。ECEF坐标的值很大,最好进一步将其转换成ENU(东北天站心坐标系)坐标,具体可参看笔者这篇文章《地心地固坐标系(ECEF)与站心坐标系(ENU)的转换》。理论上使用投影坐标系也可以,不过笔者认为还是ENU坐标系更加严密一点。另一方面,像方坐标可以在视频画面中刺点得到。由于获取像方点比较容易有误差,因此最好选取一些有明显特征的位置作为控制点来获取物方坐标和像方坐标。

经过笔者验证,即使获取了一些控制点的物方坐标和像方坐标,仍然不能像《一次实践:给自己的手机摄像头进行相机标定》这篇文章一样直接使用calibrateCamera接口计算出摄像头的内参和外参。这个接口要求对于非平面标定,需要一个初始的相机内参矩阵作为输入。因为标定解算是一个非线性方程组迭代求解的过程,初始值差距太大就有很大概率求解失败。因此,内参不能在这里进行联合解算,还是要先进行预先解算,将摄像头的内参标定好。

在获取正确的内参之后,这个问题就简化成了PnP(Perspective-n-Points)问题:通过世界空间的一组点(最少3个)的物方坐标和像方坐标,计算出摄像头的外参(位置+姿态)。这个问题可以通过OpenCV的cv::solvePnP接口来解决。实际上,这个过程就是《摄影测量学》中的后方交会。通过摄像机内参加上一组点的物方坐标和像方坐标,可以得到摄像机的外参,通常是三个旋转参数,三个平移参数。

总结下来就是,对于不用操作摄像头的静止画面,需要预先标定一次内参,然后通过实际的控制点标定一次外参。

2.2 缩放画面

摄像头静止不动的单幅画面比较好解决,但现在即使是一个普通的监控摄像头,也具备调焦和旋转角度的能力,当进行这些操作的时候,画面的注记是如何随着摄像头的动作而移动呢?

如果我们知道一点三维可视化的知识就知道,三维场景中如果要放大一个区域,有两种方式,一种是移动摄像头,将其与物体靠近;另外一种就是调整摄像头的焦距。调整焦距更加符合现实摄像头的操作,一般来说,将焦距调的越长,能看清的场景就可以越远,视场角也就会越小,就会产生画面放大的效果。基于这个思想,我们只需要实时获取在画面缩放时的焦距,加上其他内参和外参,就可以解算出注记点物方坐标对应的相方坐标,并在画面上做出调整即可。

话是这样说,不过另外一个问题在于前面我们说到摄像头的包括焦距的内参是通过相机标定的操作来实现的。我们要知道摄像头执行了调焦操作,必须使用接入摄像头对应的SDK,SDK会传出具体的焦距吗?传出的焦距与我们标定的焦距不一致该怎么办?对于专业相机,可能会提前将相机标定做好,会在SDK中传出具体的内参包括焦距值。但是对于普通相机,可能就还是需要自己进行标定了。

根据笔者的设想,调整焦距的操作并不是线性调整而是调整到几个固定的值,例如相机参数中经常可以看到的x0.5,x1.0,x2.0,x4.0这些值。也就是说,我们只需要在这些具体的调焦值时候进行相机标定,得到具体的摄像头内参;然后通过SDK获取这些调焦值,将其与摄像头内参关联上,就可以解算出正确的相方坐标,从而实现注记随缩放的动态移动。

总结:对于进行实时调焦的摄像头,要保证视频画面中的注记随着画面缩放而移动,需要预先进行有限次数的内参标定,然后通过实际的控制点标定一次外参。

2.3 缩放+旋转

内参的问题比较好解决,最多预先在不同情况下标定内参的值就可以了。但是如果要实现旋转就有点麻烦了,因为旋转参数是外参,是无法事先进行标定的。另外,旋转参数的获取也很麻烦,要知道摄像头旋转了必须通过摄像头SDK来获取,但是SDK获取的就一定的是我们想要的旋转参数吗?甚至我很怀疑是否能提供旋转参数。

在接着进行论述之前,笔者需要先介绍一下线性代数的理论知识。在线性代数的观点下,矩阵其实就是向量的张成空间。例如旋转变换决定的旋转矩阵,它的三个列向量这个三维坐标空间的三个基向量也就是基向量。旋转矩阵可以看成是这样的一个三维空间,一个X轴(1,0,0)、Y轴(0,1,0)、Z轴(0,0,1)标准笛卡尔坐标系经过旋转变换后形成的坐标系空间,旋转矩阵的三个列向量X、Y、Z轴的轴向量。

为了实时知道摄像头是否旋转了以及具体的旋转量,我们假设摄像头SDK一定会提供旋转参数,通常是是类似于“左右旋转-160度到+160度,上下旋转-75度到+75度”之间这样描述的数值。虽然我们并不知道这个摄像头给出的旋转决定的三维空间坐标系(相机坐标系)是如何描述的,但是我们可以将其复位到单位矩阵,也就是“左右旋转0度,上下旋转0度的位置”。在这个姿态下标定一次外参,令这个外参决定的旋转矩阵为Ra。接下来,摄像头旋转到任意位置的旋转参数都可以基于这个Ra来计算,因为在这种情况下,相当于是从世界坐标系通过旋转变换到了相机坐标系,世界坐标系下的Ra就是相机坐标系的单位矩阵。

如果“左右旋转X度,上下旋转Y度的位置”得到了一个旋转矩阵为Rb,那么摄像头在任意旋转姿态的旋转矩阵就是:

 

R=Rb⋅Ra

 

注意这里使用的右乘,先变换的变换在矩阵级联的右边。并且忽略了一些细节,比如左右手坐标系,坐标系的X、Y、Z轴的轴对应关系。

总结:对于摄像头缩放+旋转的情况,需要预先进行有限次数的内参标定,然后通过实际的控制点在相机坐标系原点位置标定一次相对外参标定,从而得到任意姿态的绝对外参。

2.3 移动+旋转+缩放画面

虽然笔者讨论了只存在摄像头旋转的情况,但是笔者很怀疑一般的相机摄像头是不是能做到只旋转而不移动位置。传感器是非常精密的设备,即使从外观上看摄像机是旋转了角度,但是很可能传感器的成像中心已经产生了偏移。其实高空摄像头可能会搭配专门的移动和旋转的装置,也就是所谓的“云台”,可以通过电机驱动实现摄像头的移动、旋转、倾斜和俯仰。这样的话,外参的平移量也需要我们自己进行标定了。

我们还是假设高空云台相机的SDK能提供旋转参数和平移参数,因为毕竟你要知道摄像头动起来,就必须从摄像头的SDK获取参数。不过很显然了,从摄像头的SDK获取参数不是摄像头真正的外参,这里的外参应该是相对于整个高空云台相机局部坐标系的参数。在这种情况与只旋转的解法也比较相似,只不过计算要复杂一点。在平移参数为0,旋转参数为0的位置标定外参,假设得到的结果是平移量决定的平移矩阵Ta,旋转量决定的旋转矩阵Ra。之后通过云台移动相机,得到相对平移矩阵Tb,相对旋转矩阵Rb,那么摄像头在任意位置姿态的外参矩阵就是:

 

M=Tb⋅Rb⋅Ta⋅Ra

 

其实这里有个问题,这里SDK提供的相对外参TbRb怎么来的呢?其实也是要通过预先标定得到,不过相对外参的标定就有点复杂了,有时间再研究一下。

总结:对于摄像头移动+旋转+缩放的情况,需要预先进行有限次数的内参标定,然后通过实际的控制点在高空云台相机局部坐标系的原点位置标定一次相对外参标定,从而得到任意位态的绝对外参。

3. 总结

从本文提供的解决思路可以看到,这个技术方案与摄像头硬件的关系很大,不是纯软件能够搞定的事情。因此最好能使用专业的工业级相机与计算机视觉相机,能够通过SDK提供的API动态获取这些内参和外参,它们分别是:

  1. 内参:焦距、主点、像素尺寸、畸变系数。
  2. 外参:三个位置参数,三个姿态参数。通常是相对于局部的相机坐标系的外参。

如果是普通相机,需要做的工作就多了,主要是:

  1. 进行内参和外参标定。
  2. 开发SDK输出标定的内参和外参。
  3. 项目部署前在局部的相机坐标系的原点位置,通过一组控制点进行一次相对外参标定。
  4. 得到任意位态的绝对外参,加上内参实时计算出任意注记点的像素坐标。

宝塔面板修改更换命令行默认php版本_windows 宝塔控制面板 设置php命令行使用版本-CSDN博客

mikel阅读(304)

来源: 宝塔面板修改更换命令行默认php版本_windows 宝塔控制面板 设置php命令行使用版本-CSDN博客

2021-10-12 更新

现在我发现宝塔更新了一个新功能,可以手动切换命令行的PHP版本了

 

 

//去除现有的默认PHP环境变量
rm -f /usr/bin/php

//直接设置想要的php版本作为默认的php变量
ln -sf /www/server/php/72/bin/php /usr/bin/php

故事背景:

今天我想要使用composer安装一个tp框架的组件,报错说是我的php没装fileinfo组件

 

经过查询

php -v

显示默认版本为73

可是去宝塔面板里给php73装fileinfo组件死活装不上

随后发现72有装这个组件

遂想到修改默认php版本的想法

 

确定好php位置就可以开始修改了 修改完成后成功安装

————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/BoYou233/article/details/106838093

Linux centos 宝塔面板执行donet xx.dll 提示-bash: dotnet: command not found 怎么办

mikel阅读(455)

在CentOS系统上使用宝塔面板时,如果执行 dotnet xx.dll 出现 -bash: dotnet: command not found 错误,说明系统未安装 .NET Core 运行时或未正确配置环境变量。以下是详细解决方案:


1. 安装 .NET Core 运行时

根据你的需求选择安装 .NET SDK(开发工具包).NET Runtime(仅运行时)

步骤 1:添加微软包仓库

# CentOS 7
sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm

# CentOS 8(如果适用)
sudo rpm -Uvh https://packages.microsoft.com/config/centos/8/packages-microsoft-prod.rpm

步骤 2:安装依赖项

# CentOS 7
sudo yum install -y libunwind libicu

# CentOS 8(使用 dnf)
sudo dnf install -y libunwind libicu

步骤 3:安装 .NET SDK 或 Runtime

  • 安装 .NET SDK(推荐开发环境使用)
  sudo yum install -y dotnet-sdk-6.0  # 替换为实际版本,如 7.0、8.0
  • 仅安装 .NET Runtime(生产环境使用)
  sudo yum install -y aspnetcore-runtime-6.0  # 替换为实际版本

2. 验证安装

安装完成后,执行以下命令检查是否成功:

dotnet --info

如果显示版本信息,说明安装成功。


3. 配置环境变量(如必要)

如果安装后仍提示命令未找到,可能是未正确配置环境变量。手动添加路径:

检查安装路径

默认情况下,.NET 会安装到 /usr/bin/dotnet。如果路径未加入 PATH,手动添加:

echo 'export PATH=$PATH:/usr/bin/dotnet' >> ~/.bashrc
source ~/.bashrc

4. 宝塔面板的特殊处理

宝塔面板的终端环境可能与系统环境变量不一致。尝试以下方法:

方法 1:使用绝对路径运行

直接指定 dotnet 的绝对路径:

/usr/bin/dotnet /path/to/xx.dll

方法 2:在面板中设置环境变量

进入宝塔面板的 网站管理对应网站设置环境变量,添加:

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

5. 其他注意事项

  • 安装旧版本:若需特定版本,访问 .NET 下载页 获取安装命令。
  • 权限问题:确保当前用户有权限访问 .dll 文件和相关目录。
  • 系统兼容性:确认安装的 .NET 版本与系统架构(x64/ARM)匹配。

完成上述步骤后,再次运行 dotnet xx.dll 应该可以正常执行。如果仍有问题,可检查日志或提供错误信息进一步排查。

【Web】Nginx文件已经存在全局反向代理问题如何排查记录并处理-数据运维技术

mikel阅读(318)

来源: 【Web】Nginx文件已经存在全局反向代理问题如何排查记录并处理-数据运维技术

项目场景:

阿里云搭建的宝塔Linux面板,上面已经搭建过其它网站了,我现在给一个新增的网站增加一个反向代理端口,但是通过宝塔面板添加反向代理的时候,出现了下图伪静态的错误。

 

问题描述

伪静态/nxinx主配置/vhost/文件已经存在全局反向代理

这个问题是其实是告诉我们nginx配置文件里面一个网站只能包含一个location /,不然就会产生报错了。

 

原因分析:

问题已经非常清楚了,就是nginx.conf的相关配置出现问题。

第一步,查看网站的相关配置文件,直接点击网站进入详情就可以查看配置文件了。

server
{
listen 80;
server_name www.123456.com;
index index.php index.html index.htm default.php default.htm default.html;
root /www/wwwroot/www.123456.com; 

#SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则
#error_page 404/404.html;
#SSL-END

#ERROR-PAGE-START 错误页配置,可以注释、删除或修改
#error_page 404 /404.html;
#error_page 502 /502.html;
#ERROR-PAGE-END

#PHP-INFO-START PHP引用配置,可以注释或修改
include enable-php-74.conf;
#PHP-INFO-END

#REWRITE-START URL重写规则引用,修改后将导致面板设置的伪静态规则失效
include /www/server/panel/vhost/rewrite/www.123456.com.conf;
#REWRITE-END

#禁止访问的文件或目录
location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md)
{
return 404;
}

#一键申请SSL证书验证目录相关设置
location ~ \.well-known{
allow all;
}

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
error_log /dev/null;
access_log /dev/null;
}

location ~ .*\.(js|css)?$
{
expires 12h;
error_log /dev/null;
access_log /dev/null;
}
access_log /www/wwwlogs/www.123456.com.log;
error_log /www/wwwlogs/www.123456.com.error.log;
}

可以看到我这个配置页面并没有出现单独的location /规则,都是加入了相关的后缀限制。但是可以看到上面还出现了一个  include /www/server/panel/vhost/rewrite/www.123456.com.conf 重写的规则配置文件。

切换到这个目录查看这个文件。

可以看到这个文件也是空的,没有任何配置,有些问题可能是配置了下面的伪静态规则,如果配置了的话,会显示在那个rewrite文件夹下的配置文件里面的。

现在基本可以确定这个网站的配置,没有伪静态配置,也没有其它单独的location /配置。

那问题只能出在了nginx.conf原本的配置文件里面了,可以在下面的路径查看nginx文件配置,如果你首页添加了nginx的图标,也可以直接点进去配置,也可以直接通过ssh软件登录然后直接修改文件。

查看这个nginx.conf配置文件

user www www;
worker_processes auto;
error_log /www/wwwlogs/nginx_error.log crit;
pid /www/server/nginx/logs/nginx.pid;
worker_rlimit_nofile 51200; 

events
{
use epoll;
worker_connections 51200;
multi_accept on;
}

http
{
include mime.types;
#include luawaf.conf;

include proxy.conf;

default_type application/octet-stream;

server_names_hash_bucket_size 512;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
client_max_body_size 50m;

sendfile on;
tcp_nopush on;

keepalive_timeout 60;

tcp_nodelay on;

fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 256k;
fastcgi_intercept_errors on;

gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/plain application/JavaScript application/x-JavaScript text/javascript text/css application/xml;
gzip_vary on;
gzip_proxied expired no-cache no-store private auth;
gzip_disable “MSIE [1-6]\.”;

limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;

server_tokens off;
access_log off;

server
{
listen 888;
server_name phpmyadmin;
index index.html index.htm index.php;
root /www/server/phpmyadmin;
location ~ /tmp/ {
return 403;
}

#error_page 404 /404.html;
include enable-php.conf;

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}

location ~ .*\.(js|css)?$
{
expires 12h;
}

location ~ /\.
{
deny all;
}

location / {
if (!-e $request_filename){
rewrite ^(.*)$ /index.php?s=$1 last; break;
}
}

access_log /www/wwwlogs/access.log;
}
include /www/server/panel/vhost/nginx/*.conf;
}

可以看到,确实存在一个location /匹配规则, 虽然这个规则是属于一个server:888端口下的配置,先删除再说,然后下面还看到一个Include 文件夹。去这个文件夹下查看,这个配置文件就是我们通过宝塔面板配置的网站参数配置,不需要再查看了。

删除上面那个location /, 再去添加反向代理,这次添加直接成功了。

 

解决方案:

首先需要了解nginx.conf各个路径的配置文件,这个问题涉及到三个路径的配置文件。

第一个是网站的伪静态重写配置文件,在/www/server/panel/vhost/rewrite/ 路径的文件夹下。

第二个是网站本身的配置文件,在/www/server/panel/vhost/nginx/ 路径的文件夹下。

第三个最后一个是nginx.conf配置文件,这个一般都是在/www/server/nginx/conf/ 路径下,然后查看每个配置是否存在location / 匹配规则,有的话需要删除。

这次是因为nginx.conf文件下的server:888块存在一个location / 匹配规则,把红色部分删除掉就行了。

CentOS 7.9+.net7+宝塔 部署.NET7项目最全教程 - andywu188 - 博客园

mikel阅读(254)

来源: CentOS 7.9+.net7+宝塔 部署.NET7项目最全教程 – andywu188 – 博客园

首先切换到ROOT

1
sudo -i

一、安装宝塔

1、安装宝塔8.0.4

Centos: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh
Ubuntu/Deepin: wget -O install.sh https://download.bt.cn/install/install-ubuntu_6.0.sh && sudo bash install.sh

 

2、打上开心版补丁,来源于网络,仅供测试学习(此步骤可以省略)建议购买正版

升级命令:
企业版:
curl https://io.bt.sy/install/update_panel.sh|bash
另外,需要在以下网站中加白服务器IP:
https://safe.bt.sy/

3、安装nginx,如果有需要可再安装MySQL、ftp等应用

4、新建网站

二、安装.net7环境

1、#注册 Microsoft 密钥。注册产品存储库。安装必需的依赖项。

//SentOS 7
sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm

//SentOS 8
sudo rpm -Uvh https://packages.microsoft.com/config/centos/8/packages-microsoft-prod.rpm

 

注意,如果执时后出现如下错误:

package packages-microsoft-prod-1.0-1.noarch is already installed
file /etc/yum.repos.d/microsoft-prod.repo from install of packages-microsoft-prod-1.0-1.noarch conflicts with file from package packages-microsoft-prod-1.0-1.noarch

需要在执行的命令后面加上两个参数即可解决  –nodeps –force

 

2、#安装 .NET Core 运行时(此步骤可以省略,前提是发布.net core程序时,有选择“布署模式”为“独立”,独立时,不需要单独安装环境,但发布包可能会比较大)

复制代码
.net core 7安装命令:
Centos:
sudo yum -y install aspnetcore-runtime-7.0

Ubuntu/Deepin::
sudo apt-get update && \

sudo apt-get install -y aspnetcore-runtime-7.0
复制代码

 

详明说时可以参考:https://learn.microsoft.com/zh-cn/dotnet/core/install/linux-ubuntu-2204

 

#查看Dotnet 版本信息

1
dotnet --info

其他发行版,请参考官方文档:https://docs.microsoft.com/zh-cn/dotnet/core/install/linux-centos

 

三、发布.net程序

1、以独立模式发布,此种方式,服务器不需要安装.net core 环境。

2、以框架依赖模式发布,此种方式,服务器需要安装.net core 环境,按照第二步中操作。

四、启动程序

1、将发布的程序上传到服务器新建的网站目录下

 

2、通过终端定位到站点根目录,并运行程序,此步骤可以不操作,看文章第六部分,使用守护进程来执行。

复制代码
//方案1
cd /www/wwwroot/mySiteDir
dotnet 解决方案名称.dll

//方案2(发布时生成单文件后,主程序为没有扩展名的文件)
//先安装icu库
yum install icu
//切换到程序目录
cd /www/wwwroot/mySiteDir
//设置程序执行权限
chmod 777 ./解决方案名称
//启动程序
./解决方案名称
复制代码

出现访问地址了 http://localhost:5000 即为启动成功。

五、设置反向代理

1、打开站点配置,反向代理,添加反向代理

 

填写一个名称,目标URL填

1
http://localhost:5000

发送域名这里填自己的域名(或者IP)即可,也可以填写  $host,代表当前请求的任何域名。

六、配置守护进程。(可以让网站持续运行)

1、安装supervisor

2、添加守护进程,启动用户为root,运行目录为对应的网站目录,

启动命令为【dotnet 解决方案.dll】,单文件发布时,启动命令为【./解决方案名称】

七、可能出现的问题

1、在第一次部署后,遇到报错:

1
2
System.InvalidOperationException: The SPA default page middleware could not return the default page '/index.html' because it was not found, and no other middleware handled the request.
Your application is running in Production mode, so make sure it has been published, or that you have built your SPA manually. Alternatively you may wish to switch to the Development environment.

可能是前端项目没有上传服务器。需要将解决方案目录下ClientApp/dist文件夹上传到网站根目录,具体根具实际情况来。

然后修改一下startup.cs中的Configure方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
public void Configure(IApplicationBuilder app, IOptionsMonitor<Configs> configs, IHostEnvironment env)
        {
            app.UseExceptionHandler(configs.CurrentValue.ErrorHandler);
            app.UseStaticFiles();
            app.UseWtmStaticFiles();
            //app.UseSpaStaticFiles();1.第一步修改,注释掉,新添加下面新行代码
            var spaStaticFileOptions = new StaticFileOptions
            {
                FileProvider = new Microsoft.Extensions.FileProviders.PhysicalFileProvider(System.IO.Path.Combine(env.ContentRootPath, "ClientApp/dist"))
            };
            app.UseSpaStaticFiles(spaStaticFileOptions);
            app.UseWtmSwagger();
            app.UseRouting();
            app.UseWtmMultiLanguages();
            app.UseWtmCrossDomain();
            app.UseAuthentication();
            app.UseAuthorization();
            app.UseSession();
            app.UseWtm();
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                   name: "areaRoute",
                   pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}");
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=Home}/{action=Index}/{id?}");
                if (env.IsDevelopment())
                {
                    endpoints.MapToVueCliProxy(
                        "{*path}",
                        new SpaOptions { SourcePath = "ClientApp" },
                        npmScript: "start",
                        regex: "Compiled successfully");
                }
            });
            
            app.UseWtmContext();
            //app.UseSpa(spa =>
            //{
            //    spa.Options.SourcePath = "ClientApp";
            //});2.第二步修改,注释掉,新添加下面新行代码
            app.UseSpa(spa =>
            {
                if (env.IsDevelopment())
                    spa.Options.SourcePath = "ClientApp/";
                else
                    spa.Options.DefaultPageStaticFileOptions = spaStaticFileOptions;
                //if (env.IsDevelopment())
                //{
                //    spa.UseVueCli(npmScript: "serve");
                //}
            });
        }