个人整理,仅供参考。具体规格请以官方发布为准。
表格于 2025 年 11 月整理更新。
using System.Runtime.InteropServices;
/// <summary>
/// Windows 资源管理器的文件名排序规则(允许在非 Windows 平台使用)
/// <para>调用 Windows API(StrCmpLogicalW 函数)实现,仅在 Windows 平台环境中使用</para>
/// <para>基本规则如下:</para>
/// <para>将文件名中的数字作为数值来处理。</para>
/// <para>不区分大小写。</para>
/// <para>字符类型的大致优先级顺序为:特殊符号 → 数字 → 字母。</para>
/// <para>对于中文文件名,排序方式取决于系统的区域设置:拼音(默认)、笔画。</para>
/// </summary>
public class FileLogicalComparer : IComparer<string>
{
[DllImport("Shlwapi.dll", CharSet = CharSet.Unicode)]
private static extern int StrCmpLogicalW(string psz1, string psz2);
private static readonly bool IsWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows);
public int Compare(string? x, string? y)
{
// 处理 null 值情况
if (x == null && y == null) return 0;
if (x == null) return -1;
if (y == null) return 1;
try
{
if (IsWindows)
{
// Windows 平台:使用原生 API
return StrCmpLogicalW(x, y);
}
else
{
// 非 Windows 平台:使用 C# 实现的回退方案
return NaturalCompareFallback(x, y);
}
}
catch (Exception) // 捕获 DllNotFound、EntryPointNotFoundException 等异常
{
// 异常时使用默认的字符串比较器
return string.Compare(x, y, StringComparison.Ordinal);
}
}
/// <summary>
/// C# 实现的自然排序回退方案(代码来自 AI,未测试!)
/// </summary>
private static int NaturalCompareFallback(string x, string y)
{
if (x == y) return 0;
int i = 0, j = 0;
while (i < x.Length && j < y.Length)
{
if (char.IsDigit(x[i]) && char.IsDigit(y[j]))
{
// 提取连续数字并进行数值比较
string num1 = ExtractNumber(x, ref i);
string num2 = ExtractNumber(y, ref j);
if (long.TryParse(num1, out long n1) && long.TryParse(num2, out long n2))
{
if (n1 != n2)
return n1.CompareTo(n2);
}
else
{
// 解析失败时按字符串比较
int strCompare = string.Compare(num1, num2, StringComparison.Ordinal);
if (strCompare != 0)
return strCompare;
}
}
else
{
// 非数字字符直接比较
if (x[i] != y[j])
return x[i].CompareTo(y[j]);
i++;
j++;
}
}
return x.Length.CompareTo(y.Length);
}
/// <summary>
/// 从字符串中提取连续的数字序列
/// </summary>
private static string ExtractNumber(string str, ref int index)
{
int start = index;
while (index < str.Length && char.IsDigit(str[index]))
{
index++;
}
return str.Substring(start, index - start);
}
}
一、安装 Ollama
从官网下载安装 Ollama。
查看版本号:
ollama --version二、在 shell 中安装和运行模型
在 Models 中选择一个你想部署的模型,复制安装命令,并在终端中执行。
官方建议:应该至少有 8 GB 的 RAM 来运行 7b 版本,16 GB 的 RAM 来运行 13b 版本,32 GB 的 RAM 来运行 33b 版本。
本文以 deepseek-r1:7b 为例。
下载模型
ollama pull deepseek-r1:7bTip: 下载即将完成时速度可能会变得非常慢,只要按 Ctrl+C,再重新执行一次命令,就会继续正常下载。
显示模型信息
ollama show deepseek-r1:7b运行模型(一次性响应)
ollama run deepseek-r1:7b "写一首诗"运行模型(进入聊天模式)
ollama run deepseek-r1:7b结束当前会话
/bye列出所有模型
ollama list列出当前加载的模型
ollama ps停止当前正在运行的模型
ollama stop deepseek-r1:7b三、使用 REST API 调用模型
修改端口
ollama serve --port 11434/api/generate 接口:生成一次性响应
curl http://localhost:11434/api/generate -d '{
"model": "deepseek-r1:7b",
"prompt":"为什么天空是蓝色的?"
}'/api/chat 接口:与模型聊天
curl http://localhost:11434/api/chat -d '{
"model": "deepseek-r1:7b",
"messages": [
{ "role": "user", "content": "你好呀!" }
]
}'四、在 .NET 中调用
1、直接 HTTP 调用(基础方案)
创建 HttpClient,使用 PostAsJsonAsync 请求,使用 ReadFromJsonAsync 读取结果。
2、使用 OllamaSharp 库(推荐方案)
创建 OllamaApiClient,使用 SelectedModel 设置模型,使用 GenerateAsync 获得结果。或创建对话 ollama.Chat(),并 Send 内容。
3、.NET Aspire 集成(企业级方案)
适合微服务架构,结合容器化部署。
“OllamaSharp 库”和“.NET Aspire 集成”两种方案怎么选?
OllamaSharp 库:定位轻量级模型交互 SDK,适用于独立应用、微服务中的 AI 组件等场景,技术复度低,支持模型对话/生成/管理、流式响应、多模态支持,需自行实现监控、熔断。
.NET Aspire 集成:定位企业级云原生 AI 服务编排框架,适用于多服务协同的分布式系统,技术复度高,支持服务编排、健康检查、弹性伸缩、混合云部署,内置可观测性仪表盘、自动故障转移。
决策建议:初创项目用 OllamaSharp 快速试错,用户量破千后通过 Aspire 重构。两者并非互斥,可在 Aspire 中封装 OllamaSharp 客户端,兼顾灵活性与运维能力。
安装 PyPI(包/库/组件):
pip install 包名如果安装失败,尝试用国内镜像
pip install 包名 -i https://pypi.tuna.tsinghua.edu.cn/simple如果不想每次都加 -i 参数,可以更改全局配置
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple查看所有配置
pip config list查看 python 文件路径
# Windows 或 Linux 通用
python -c "import sys; print(sys.executable)"默认路径为:C:\Users\<user name>\AppData\Local\Programs\Python\Python<version>\python.exe
常用组件介绍
| 包名 | 介绍 |
|---|---|
| Flask | 一款基于 Python 的轻量级 Web 开发框架 |
| Django | 一款基于 Python 的重量级 Web 开发框架 |
| Pandas | 一个数据分析包,提供 Series、Time-Series、DataFrame、Panel、Panel4D、PanelND 等数据结构 |
更多
一般地,在路由器上启用 UPnP 就可以了。
如果局域网中有多台监控设备,或有多层局域网,可以尝试直接端口映射。
在监控控制面板中查看主机 IP(注意不是各通道的 IP),或者在同一层局域网通过电脑浏览器中访问监控控制面板(http://主机ip)。
然后就可以在路由器上配置端口映射了(有些路由器的菜单项为“NAT 服务”)。
一般配置 554(RTSP 端口)和 8000(服务端口)就可以了,80(HTTP 端口)和 443(HTTPS 端口)用于通过浏览器管理监控系统,不需要在外网配置的话不需要映射,暴露在公网有安全风险。另外 9010(平台命令端口)和 9020(平台数据端口)作用未知,可不映射。
当然,为了防止端口冲突或提高安全性,映射的外部端口和内部端口可以不相同。
本文介绍 Token 认证和 HMAC 认证两种方式。
一、Token 接口认证方式
原理:
客户端使用账号密码等信息登录,服务器验证通过后生成一个 Token 发送给客户端。客户端在后续的请求中携带这个 Token,服务器通过验证 Token 来确认用户的身份和权限。
应用场景:移动应用、Web 应用(特别是 SPA)
优点:
无状态性,即服务器不需要存储用户的会话信息。
易于实现跨域认证。
缺点:
Token 可能被窃取,应使用 HTTPS、不暴露在 URL 中、使用 HttpOnly 的 Cookie、对 Session ID 进行验证、设置合理过期时间、对 Token 进行加密等措施加强防范。
二、HMAC 接口认证方式
原理:
客户端将消息M与密钥K连接起来,通过哈希函数计算得到 HMAC 值,发送给服务器。服务器收到请求后,使用相同的密钥和请求参数重新计算 HMAC 值,如果与客户端发送的签名一致,即是合法请求。
优点:
安全性较高,攻击者很难伪造 HMAC 值,截获并篡改数据也无法通过服务端验证。
计算效率较高,哈希函数(如 MD5、SHA-1、SHA-256 等)计算效率比较高。
缺点:
密钥的更新和管理比较麻烦。
扩展:
在消息体中添加时间戳以防止重放攻击。
加密隐私数据:可以使用对称加密算法(如 AES)或非对称加密算法(如 RSA、ECC 等)对部分隐私数据进行加密。非对称算法虽然更安全,但速度较慢,如需加密大量数据,可以考虑使用对称加密算法进行加密,然后使用非对称加密算法对对称密钥进行加密。
国家智慧教育公共服务平台 https://gjzwfw.www.gov.cn/
中国裁判文书网 https://wenshu.court.gov.cn/
国家企业信用信息公示系统 https://gs.gsxt.gov.cn/
国家社会保险服务平台 https://si.12333.gov.cn/
国家法律法规数据库 https://flk.npc.gov.cn/
中国专利公布公告网 http://epub.cnipa.gov.cn/
国家标准全文公开系统 https://openstd.samr.gov.cn/bzgk/gb/
国家药品监督管理局 https://www.nmpa.gov.cn/datasearch/
食品安全抽检公布结果查询系统 https://spcjsac.gsxt.gov.cn/
工信部申诉受理中心 https://ythzxfw.miit.gov.cn/
合同示范文本库 https://htsfwb.samr.gov.cn/
中国法律服务网 https://www.12348.gov.cn/
中国庭审公开网 https://tingshen.court.gov.cn/
非 gov 网站
终身教育平台 https://le.ouchn.cn/
国家数字图书馆 https://www.nlc.cn/
国家哲学社会科学文献 https://www.ncpssd.cn/
国家高等教育智慧教育平台 https://www.chinaooc.com.cn/
职业教育专业教学资源库 https://zyk.icve.com.cn/
本文仅针对自己遇到的情况进行整理,并不完善,仅供参考。

首先点击这个封禁页面上的“客服指引”,在“微信访问网站被限制的相关问题”页面上找到反馈邮箱 moment@tencent.com,按规定格式给这个邮箱反馈情况,可以咨询具体被封禁的原因和网址等方便处理。几分钟后就能收到回信(即使是周末)。这次被告知是被手机管家拦截,并提供了另一个申述通道:http://gj.qq.com/online_server/complain_url.html。提交网址申述后等待3个工作日。
实际等了1个小时就收到回复了(即使是周末)。

附:在线网址检测:https://urlsec.qq.com/check.html
连接 Filezilla Server 时提示“服务器的证书未知。请小心验证证书以确信该服务器可信任。”

解决办法:登录服务器,打开 Administrator FileZilla Server,菜单中选择 Server,Configure,点击左侧的 Administration,切换到 Connection security 页,点击 Generate new 按钮,OK。

Protocols settings 的 FTP and FTP over TLS(FTPS) 中同样也需要点击 Generate new。
前几天实现了在 nginx 中使用 lua 实现远程鉴权,今天想试试在 IIS 中能不能实现相同的功能。查询资料发现需要使用 URL 重写和 HTTP 请求模块,没有深究。干脆使用 ASP.NET 中间件来实现吧。
在 StratUp.cs 的 Configure 方法中,或 Program.cs 文件中添加以下代码:
// 远程鉴权
app.Use(async (context, next) =>
{
var ip = context.Connection.RemoteIpAddress!.ToString();
var ua = context.Request.Headers.UserAgent.ToString();
var host = context.Request.Host.Host;
var uri = new Uri(context.Request.GetDisplayUrl()).PathAndQuery;
var client = new HttpClient();
client.Timeout = TimeSpan.FromSeconds(1); // 设置超时时间
try
{
var requestUrl = "https://鉴权地址/";
var requestMessage = new HttpRequestMessage(HttpMethod.Get, requestUrl);
requestMessage.Headers.Add("X-Real-IP", ip);
requestMessage.Headers.Add("User-Agent", ua);
requestMessage.Headers.Add("X-Forwarded-Host", host);
requestMessage.Headers.Add("X-Forwarded-Uri", uri);
// 发送请求
var response = await client.SendAsync(requestMessage);
// 检查响应状态码
if (response.StatusCode == HttpStatusCode.Forbidden)
{
// 如果返回403,则拒绝访问
context.Response.StatusCode = (int)HttpStatusCode.Forbidden;
await context.Response.WriteAsync("Access Denied");
}
else
{
// 如果返回其他状态码,则继续执行管道中的下一个中间件
await next();
}
}
catch (TaskCanceledException ex) when (ex.CancellationToken.IsCancellationRequested)
{
// 如果请求超时(任务被取消),则继续执行管道中的下一个中间件
await next();
}
catch
{
// 如果遇到错误,则继续执行管道中的下一个中间件
await next();
}
});代码很简单,使用 HttpClient 发送请求,若返回 403 则拒绝访问,其它情况继续执行业务逻辑,超时或报错的情况按需修改即可。
若鉴权接口在私网中,建议将鉴权接口域名和私网 IP 添加到 hosts 文件中。


