Qishao.DingTalkStream.Core
2026.8.7
dotnet add package Qishao.DingTalkStream.Core --version 2026.8.7
NuGet\Install-Package Qishao.DingTalkStream.Core -Version 2026.8.7
<PackageReference Include="Qishao.DingTalkStream.Core" Version="2026.8.7" />
<PackageVersion Include="Qishao.DingTalkStream.Core" Version="2026.8.7" />
<PackageReference Include="Qishao.DingTalkStream.Core" />
paket add Qishao.DingTalkStream.Core --version 2026.8.7
#r "nuget: Qishao.DingTalkStream.Core, 2026.8.7"
#:package Qishao.DingTalkStream.Core@2026.8.7
#addin nuget:?package=Qishao.DingTalkStream.Core&version=2026.8.7
#tool nuget:?package=Qishao.DingTalkStream.Core&version=2026.8.7
Qishao.DingTalkStream.Core
Qishao.DingTalkStream.Core 是钉钉 Stream 模式的基础库,负责注册订阅、建立长连接、接收推送、排队去重、并发调度消息处理器,以及生成推送响应数据。
安装
dotnet add package Qishao.DingTalkStream.Core
目标框架
net8.0netstandard2.1
当前项目直接引用 Microsoft.Extensions.*。netstandard2.1 额外引用 System.Text.Json。
引用方式
当前仓库内使用项目引用:
<ProjectReference Include="..\Qishao.DingTalkStream.Core\Qishao.DingTalkStream.Core.csproj" />
快速开始
在 Generic Host 中注册 Stream 客户端、订阅和消息处理器:
using Qishao.DingTalkStream.Core;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
var host = Host.CreateDefaultBuilder(args)
.ConfigureServices((context, services) =>
{
services.AddDingtalkStream(options =>
{
options.ClientId = context.Configuration["ClientId"];
options.ClientSecret = context.Configuration["ClientSecret"];
options.AutoReplySystemMessage = true;
options.MaxTaskCount = Environment.ProcessorCount;
})
.RegisterEventSubscription()
.RegisterCardInstanceCallback()
.AddMessageHandler<DefaultStreamMessageHandler>()
.AddHostServices();
})
.Build();
await host.RunAsync();
消息处理器实现 IDingTalkStreamMessageHandler:
using Qishao.DingTalkStream.Core;
public sealed class DefaultStreamMessageHandler : IDingTalkStreamMessageHandler
{
public async Task HandleMessage(MessageEventHanderArgs e)
{
if (e.Type != SubscriptionType.EVENT)
{
return;
}
var data = await DingTalkStreamUtilities.CreateReply_EventSuccess_MessageData("OK");
var reply = await DingTalkStreamUtilities.CreateReplyMessage(e.Headers.MessageId, data);
await e.Reply(reply);
}
}
配置方式
推荐使用委托方式配置 ClientId 和 ClientSecret,因为当前 AddDingtalkStream(IConfiguration) 重载读取的是 ClientScript 键:
{
"ClientId": "your-client-id",
"ClientScript": "your-client-secret",
"UA": "your-app/1.0.0",
"AutoReplySystemMessage": "true",
"Subscriptions": [
{
"Type": "EVENT",
"Topic": "*"
},
{
"Type": "CALLBACK",
"Topic": "/v1.0/card/instances/callback"
}
]
}
如果配置文件使用 ClientSecret,请使用 AddDingtalkStream(options => ...)。
注册 API
| API | 作用 |
|---|---|
AddDingtalkStream(Action<DingTalkStreamOptions>) |
注册 DingTalkStreamOptions 并返回构建器。 |
AddDingtalkStream(IConfiguration) |
从配置对象读取 ClientId、ClientScript、UA、AutoReplySystemMessage 和 Subscriptions。 |
RegisterSubscription(type, topic) |
注册自定义订阅,自动去重相同 type + topic。 |
RegisterEventSubscription() |
注册事件推送订阅:EVENT + *。 |
RegisterCardInstanceCallback() |
注册卡片回调订阅:CALLBACK + /v1.0/card/instances/callback。 |
AddMessageHandler<T>() |
以 transient 生命周期注册消息处理器。 |
AddHostServices() |
注册 DingTalkStreamClientWorker,Host 启动后自动连接 Stream。 |
运行机制
DingTalkStreamClientWorker延迟 1 秒启动。- Worker 创建
DingTalkStreamClient,并订阅客户端的OnMessage事件。 - Client 使用
ClientId、ClientSecret和订阅列表请求钉钉 Stream 网关连接信息。 - Client 通过
ClientWebSocket建立长连接并接收文本消息。 - 开启
AutoReplySystemMessage后,Client 自动处理SYSTEM类型的ping和disconnect。 - 非系统消息进入 Worker 队列,Worker 按
Headers.MessageId做队列内和执行中去重。 - Worker 每次从 DI scope 中解析一个
IDingTalkStreamMessageHandler来处理消息。
主要模型
| 类型 | 说明 |
|---|---|
DingTalkStreamOptions |
Stream 客户端配置,包含凭证、UA、订阅列表和并发参数。 |
Subscription |
单条订阅配置,包含 Type 和 Topic。 |
DingTalkStreamClient |
请求网关、建立 WebSocket、接收消息、重连和回复系统消息。 |
MessageEventHanderArgs |
推送消息参数,继承 DingTalkStreamDataPackage,并提供 Reply(byte[])。 |
DingTalkStreamDataPackage |
包装原始推送 JSON,提供 SpecVersion、Type、Headers、Data。 |
DingTalkStreamDataHeaders |
包装 headers,提供 AppId、ConnectionId、Topic、MessageId、ContentType、Time。 |
DingTalkStreamEventDataHeaders |
事件推送 headers 扩展模型,可由 ToEventDataHeaders() 转换。 |
回复工具
DingTalkStreamUtilities 提供以下辅助方法:
| 方法 | 作用 |
|---|---|
CreateReplyMessage(messageId, data) |
构造发送给 Stream 服务端的完整响应。 |
CreateReply_EventSuccess_MessageData(customMessage) |
构造事件消费成功数据。当前返回字段为 status = "SUCESS"。 |
CreateReply_EventFaild_MessageData(customMessage) |
构造事件稍后重试数据,返回 status = "LATER"。 |
CreateReply_Callback_MessageData(responseJson) |
将回调业务响应包装为 {"response": ...}。 |
并发和去重
MaxTaskCount控制同时处理消息的任务数,默认是Environment.ProcessorCount。- Worker 使用
ConcurrentQueue<MessageEventHanderArgs>保存待处理消息。 - Worker 使用
ConcurrentDictionary<string, MessageEventHanderArgs>记录执行中的消息。 - 相同
MessageId已在队列中或正在执行时,新推送会被忽略。 SingleExecuteTimeOut只用于记录超时警告,不会取消处理器。RecentExecutionTimeCount控制最近执行耗时的滑动窗口大小。MaxQueueCount和TimeInterval当前只在 options 中定义,Worker 当前没有按这两个值限制队列或轮询。
注意点
MessageEventHanderArgs、OnStoped、CreateReply_EventFaild_MessageData等名称是当前公开 API,拼写保持兼容。AddDingtalkStream(IConfiguration)使用ClientScript键读取密钥。Reply(byte[])应尽快调用。注释中说明 5 秒内未回复时,服务端可能重发。- 事件订阅会在请求网关时合并为
EVENT+*。 - 非
EVENT类型会按实际Topic写入订阅列表。
构建验证
dotnet build .\Qishao.DingTalkStream.Core\Qishao.DingTalkStream.Core.csproj --no-restore
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.1 is compatible. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.1
- Microsoft.Extensions.Configuration.Abstractions (>= 8.0.0)
- Microsoft.Extensions.Hosting.Abstractions (>= 8.0.1)
- Microsoft.Extensions.Logging.Abstractions (>= 8.0.2)
- Microsoft.Extensions.Options (>= 8.0.2)
- System.Text.Json (>= 8.0.6)
- System.Threading.Channels (>= 8.0.0)
-
net8.0
- Microsoft.Extensions.Configuration.Abstractions (>= 8.0.0)
- Microsoft.Extensions.Hosting.Abstractions (>= 8.0.1)
- Microsoft.Extensions.Logging.Abstractions (>= 8.0.2)
- Microsoft.Extensions.Options (>= 8.0.2)
NuGet packages (1)
Showing the top 1 NuGet packages that depend on Qishao.DingTalkStream.Core:
| Package | Downloads |
|---|---|
|
Qishao.DingTalkStream.Robot
C# 版本的钉钉Stream模式API SDK,支持订阅内容【机器人消息回调】扩展。内部具备 webhook 回复能力 |
GitHub repositories
This package is not used by any popular GitHub repositories.