C# Dapr集成方法 C#如何构建Dapr分布式应用

来源:这里教程网 时间:2026-02-21 17:42:43 作者:

如何在C#项目中正确引用Dapr客户端SDK

必须使用官方维护的

Dapr.Client
NuGet 包(不是
Dapr.AspNetCore
或旧版
Dapr.DotNet.Sdk
),当前稳定版推荐 1.12+。若项目是 .NET 6+,直接
dotnet add package Dapr.Client
即可;若用 Visual Studio,需确认包源为 nuget.org 且未勾选“包含预发行版”——否则可能意外装入不兼容的 alpha 版本。

常见错误:项目同时引用了

Dapr.AspNetCore
和手动初始化
DaprClient
,导致 HTTP 客户端复用冲突,表现为随机
HttpRequestException
或连接池耗尽。解决方案是二选一:纯客户端调用走
DaprClient
,Web API 集成才用
Dapr.AspNetCore

调用其他服务时,为什么总是提示“connection refused”或“no route to host”

Dapr sidecar 默认监听

http://localhost:3500
,但 C# 应用必须显式指定该地址才能通信。不能依赖默认构造函数——
new DaprClient()
会尝试连
http://localhost:80
,必然失败。

正确做法:

本地开发:用
DaprClient.CreateInvokeClient("http://localhost:3500")
或传入
new DaprClientBuilder().UseGrpcChannelOptions(...)
(gRPC 模式需 sidecar 启动时加
--app-port
Kubernetes 环境:改用
http://<service-name>.dapr.svc.cluster.local:3500</service-name>
,其中
service-name
是目标应用的 Kubernetes Service 名,不是 Dapr 的 component 名
务必检查 sidecar 是否真在运行:
curl http://localhost:3500/v1.0/healthz
返回 204 才算就绪

状态管理写入失败,报错“ERR_STATE_STORE_NOT_CONFIGURED”

这个错误不是代码问题,而是 Dapr runtime 启动时没加载状态组件配置。C# 侧调用

client.SaveStateAsync("statestore", "key", value)
前,必须确保:

存在对应 YAML 文件(如
components/statestore.yaml
),内容包含
type: state.redis
type: state.memory
,且
version: v1
启动应用时通过
--components-path ./components
显式挂载,或在 Kubernetes 中通过
DaprComponent
CRD 部署
statestore
这个名字必须和 YAML 中的
metadata.name
完全一致,大小写敏感

容易忽略的一点:Dapr CLI 默认只加载

./components
目录下的文件,若把 YAML 放在子目录(如
./components/prod/
)里,不会自动识别。

发布事件后订阅方收不到,排查要点有哪些

Dapr Pub/Sub 是解耦模型,收不到消息大概率卡在三个环节:发布端地址、订阅端路由、topic 权限配置。

实操检查项:

发布端用的是
client.PublishEventAsync("pubsub", "topic-a", data)
,其中
pubsub
必须与 components 目录下 Pub/Sub 组件的
metadata.name
一致
订阅端必须暴露一个符合 Dapr 调用规范的 HTTP endpoint:
POST /dapr/subscribe
返回 JSON 数组,且每个元素含
topic
route
字段;
route
值(如
/api/order
)要与实际 Controller 的路由完全匹配
确认 sidecar 启动参数含
--app-id myapp
,且该 ID 在 Kubernetes 中需与 Service 名一致(否则 Dapr 控制平面无法路由)
如果用 Redis 作为 Pub/Sub,注意它不支持 topic 分区,所有订阅者都会收到全量消息——这不是 bug,是设计如此

最隐蔽的问题:ASP.NET Core 默认启用 HTTPS 重定向中间件,会导致 Dapr sidecar 的 HTTP POST 订阅请求被 307 重定向,而 sidecar 不跟随跳转,直接失败。关掉

app.UseHttpsRedirection()
或仅对非 Dapr 路由启用。

相关推荐