使用dapr .net Client SDK 踩过的坑(持续更新)
1、服务调用 Service invocation
InvokeMethodAsync方法,如果带请求参数,那么请求参数的泛型必须是对象,如 (stateKeyName为字符串)
var data = await _daprClient.InvokeMethodAsync<object, ProductModel>("productservice", "Product/GetState", stateKeyName, cts.Token); //服务调用成功,参数正常传过去了
var data = await _daprClient.InvokeMethodAsync<string, ProductModel>("productservice", "Product/GetState", stateKeyName, cts.Token); //服务调用成功,参数没传过去
对应的服务端,接受的参数也必须是object类型,string类型就获取不到参数。
(不一定正确,有待进一步验证,可以看看dapr .NET SDK的源码,附搬到码云的地址 https://gitee.com/arthaslcm/dotnet-sdk)
2、发布订阅
发布:
订阅:
如果订阅服务的参数类型直接放发布端传过来的数据类型是不行的,看了源码发现发布的时候数据封装在了一个CloudEvents中,所以接受参数的时候需要先解析json字符串取出来。。
上图中订阅端的参数类型可以为object,发布端传的参数放在object.data里,需要自己解析出来。(找到原因了,往下看)
而源码中订阅的例子中是这样的,照着弄了半天才发现根本行不通啊。。
又回去看源码了,才发现还要在Startup文件处注册一个中间件,用来解包请求,好嘛。。。我真是太菜了
dapr文档的说明:
禁用CloudEvents包装数据的方法:
https://docs.dapr.io/zh-hans/developing-applications/building-blocks/pubsub/pubsub-raw/