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

1次阅读

必须使用官方 dapr.client 1.12+ 包,显式指定 sidecar 地址(如 http://localhost:3500),确保状态组件 yaml 正确配置并挂载,pub/sub 需匹配组件名、正确暴露订阅路由且禁用 https 重定向。

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

如何在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.redistype: 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 数组,且每个元素含 topicroute 字段;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 路由启用。

text=ZqhQzanResources