字段类型 | 是否分词 (Analyzed) | 是否索引 (Indexed) | 是否存储 (Stored) | 适用场景 |
|---|---|---|---|---|
Int32Field Int64Field | 否 | 是 | 由 Store参数决定 | 时间戳、数值等需要范围查询的字段 |
StringField | 否 | 是 | 由 | 订单号、身份证号、URL等需要精确匹配的字段 |
TextField | 是 | 是 | 由 | 文章标题、正文、描述等需要全文搜索的字段 |
StoredField | 否 | 否 | 是 | 仅用于存储,不参与搜索(如图片路径、文件等二进制数据) |
今天发现在 .NET Framework 和 .NET 9 中使用 System.Uri.EscapeDataString() 方法对字符串进行编码,会产生不同的结果。
譬如“(”符号,前者视其为非保留字符,不进行转义,后者视为保留字符,转义为“%28”。
原因是 .NET Framework 4.8 主要遵循 RFC 2396,而 .NET 9 遵循 RFC 3986。
在跨平台签名验证场景中,对 URL 编码的一致性要求极高,任何细微差别都会导致签名校验失败。
以下是以 RFC 3986 标准为核心、优先使用各平台内置的高一致性方案。
对于 .NET 9,直接使用 Uri.EscapeDataString()。
string encodedData = System.Uri.EscapeDataString(dataToEncode);对于 .NET Framework,以下是一个遵循 RFC 3986 严格标准的自定义编码方法示例。
static string Rfc3986EscapeDataString(string input)
{
// 定义 RFC 3986 中明确的未保留字符集(不编码)
var unreservedChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~";
var result = new StringBuilder();
byte[] data = Encoding.UTF8.GetBytes(input); // 统一转换为 UTF-8 字节
foreach (byte b in data)
{
char currentChar = (char)b;
// 如果是未保留字符,直接输出
if (unreservedChars.IndexOf(currentChar) != -1)
{
result.Append(currentChar);
}
else
{
// 否则,进行百分号编码(%XX,大写)
result.Append('%').Append(b.ToString("X2"));
}
}
return result.ToString();
}对于 PHP,直接使用内置的 rawurlencode() 函数。这个函数的设计初衷就是严格遵循 RFC 3986 标准。
$encoded_data = rawurlencode($data_to_encode);对于 JavaScript,encodeURIComponent 函数严格遵循 RFC 3986 标准。
let encodedData = encodeURIComponent(dataToEncode);重要提示:无论使用哪种语言,务必在编码前明确指定字符串使用 UTF-8 编码。编码不一致是导致乱码和签名失败最常见的原因之一 。
一、安装 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删除一个模型
ollama rm 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 客户端,兼顾灵活性与运维能力。
| 方法/工具 | 发布时间 | 所属框架 | 命名空间/依赖项 | 编码标准 | 空格处理 | 严格性 | 适用场景 | 现代项目支持(.NET 6+) |
|---|---|---|---|---|---|---|---|---|
| HttpUtility.UrlEncode | 2002 | .NET Framework 1.0+ | System.Web(需引用 DLL) | x-www-form-urlencoded | + | 宽松 | 传统 ASP.NET WebForms | ❌ |
| Server.UrlEncode | 2002 | .NET Framework 1.0+ | System.Web(ASP.NET 页面内) | x-www-form-urlencoded | + | 宽松 | ASP.NET WebForms 页面内编码 | ❌ |
| Uri.EscapeDataString | 2005 | .NET Framework 2.0+ | System(核心库) | RFC 3986 | %20 | 严格 | 构造 URI 组件(路径、查询参数) | ✔️ |
| WebUtility.UrlEncode | 2012 | .NET Framework 4.5+ | System.Net(跨平台) | x-www-form-urlencoded | + | 宽松 | 非 Web 环境或兼容旧代码 | ✔️ |
| UrlEncoder.Default.Encode | 2016 | .NET Core 1.0+ | System.Text.Encodings.Web | RFC 3986 | %20 | 严格 | 现代应用,严格 URI 编码 | ✔️ |
关键选择原则
兼容旧代码 → HttpUtility.UrlEncode 或 WebUtility.UrlEncode。
严格 URI 规范 → Uri.EscapeDataString 或 UrlEncoder。
ASP.NET Core → UrlEncoder。
非 Web 或跨平台 → 弃用 System.Web,选择 System.Net 或 System.Text.Encodings.Web 中的方法。
打开 .csproj 项目文件,在 <PropertyGroup> 标签内添加:
<Version>
1.0.$([System.Math]::Floor($([System.DateTime]::Now.Subtract($([System.DateTime]::Parse('2000-01-01T00:00:00Z'))).TotalDays))).$([MSBuild]::Divide($([System.Math]::Floor($([System.DateTime]::Now.TimeOfDay.TotalSeconds))), 2))
</Version>最终生成的版本号示例: 1.0.9238.28518
其中,Major 与 Minor 是固定的,Build 是2000年1月1日至今的天数,Revision 是今天的秒数 / 2 所得的值。(为了防止数值超过 65535)
程序中获取版本号:
var version = Assembly.GetExecutingAssembly().GetName().Version!; // 当前类库
var version = Assembly.GetEntryAssembly()?.GetName().Version!; // 入口项目从版本号获取发布时间:
DateTime versionTime = new DateTime(2000, 1, 1).AddDays(version.Build).AddSeconds(version.Revision * 2);在解决方案资源管理器中找到 Properties/AssemblyInfo.cs 文件。该文件存放程序集版本信息。
修改版本号格式
将以下代码片段中的 AssemblyVersion 改为使用星号通配符(建议保留主版本和次版本号):
[assembly: AssemblyVersion("1.0.*")] // 自动生成构建号和修订号 // [assembly: AssemblyFileVersion("1.0.0.0")] // 注释或删除此行关闭确定性构建
用文本编辑器打开 .csproj 项目文件,在 <PropertyGroup> 标签内添加:
<Deterministic>false</Deterministic>此设置允许 MSBuild 生成动态版本号。
最终生成的版本号示例: 1.0.9238.28518
其中,Major 与 Minor 是固定的,Build 是2000年1月1日至今的天数,Revision 是今天的秒数 / 2 所得的值。(为了防止数值超过 65535)
程序中获取版本号:
var version = Assembly.GetExecutingAssembly().GetName().Version;从版本号获取发布时间:
DateTime versionTime = new DateTime(2000, 1, 1).AddDays(version.Build).AddSeconds(version.Revision * 2);查看 .NET Core / .NET 5+ 实现自动版本号的方法
截止 2024 年 9 月,CZDB 数据已支持 JAVA、PHP、C、Node.js、Python 语言解析,但官方迟迟未推出 C# / ASP.NET 的版本,于是我参照前面几种语言版本写了 C# 版,支持 IPv4 与 IPv6,实测查询速度,CZDB 版的 MEMORY 模式比原来的 DAT 版数据库快数百倍(具体要看磁盘和内存的读写速度)。能够有效降低 CPU 的使用率,特别是在需要频繁查询 IP 属地的应用场景(譬如每个 HTTP 请求都要判断 IP 属地来决定是否允许访问)。
源代码已提交给纯真官方,相信很快就会有官方版本的 SDK。
打开 JS 文件,查找:
o+=String.fromCharCode(t.charCodeAt(r)^i[(i[e]+i[s])%256]);水印文字是从这个变量 o 输出来的,可以在这句的后面,“return o”的前面插入“console.log(o);”看到效果。
因为它是一行一行返回的,所以将
return o改为下面的三目即可:
return o=='GoJS 3.0 evaluation'||o=='(c) 1998-2024 Northwoods Software'||o=='Not for distribution or production use'||o=='gojs.net'?'':o修改方法来源于网络,仅供学习参考,请勿用于生产环境,请支持正版!
尝试捕获 InnerException 的 Message:
catch (Exception ex)
{
return BadRequest(ex.InnerException?.Message ?? ex.Message);
}得到具体的错误信息:
Failed to find library "leptonica-1.82.0.dll" for platform x64.
GitHub 上有人提出了同样的问题,去看看。
解决方法:
安装 VC Redist。
其实 Tesseract 的 GitHub 已经提到需要安装 Visual Studio 2019 运行时。