tnblog
首页
视频
资源
登录

Dapr .NetCore 调用方法

7814人阅读 2021/9/28 10:45 总访问:3659016 评论:0 收藏:0 手机
分类: 云产品

Dapr .NetCore 调用方法

创建客户端项目(InvokeMethod)


在Program类中设置日志控制台输出,在 launchSettings.json 设置运行的端口为5001

  1. public static IHostBuilder CreateHostBuilder(string[] args) =>
  2. Host.CreateDefaultBuilder(args)
  3. .ConfigureLogging(logging =>
  4. {
  5. logging.ClearProviders();
  6. logging.AddConsole();
  7. logging.AddDebug();
  8. })
  9. .ConfigureWebHostDefaults(webBuilder =>
  10. {
  11. webBuilder.UseStartup<Startup>();
  12. });
  1. {
  2. "profiles": {
  3. "InvokeMethod": {
  4. "commandName": "Project",
  5. "launchBrowser": true,
  6. "launchUrl": "weatherforecast",
  7. "applicationUrl": "http://localhost:5001",
  8. "environmentVariables": {
  9. "ASPNETCORE_ENVIRONMENT": "Development"
  10. }
  11. }
  12. }
  13. }


安装dapr的依赖包 Dapr.AspNetCore,我这里的版本是1.4.0

  1. Install-Package Dapr.AspNetCore
  2. # or
  3. dotnet add package Dapr.AspNetCore


安装json序列化的包(Newtonsoft.Json)

  1. Install-Package Newtonsoft.Json
  2. # or
  3. dotnet add package Newtonsoft.Json


安装Dapr服务

  1. services.AddControllers().AddDapr();


创建 SendMessageController 控制器,其中里面有三个可请求的方法
(Send) 将mydata发送Get请求到appId为myserverRequest方法中
(Sendv2) 比上面一个多一种http请求方式,且是POST方法,判断请求是否成功
(Sendv3) 比上面多接受处理返回结果

  1. [ApiController]
  2. [Route("[controller]")]
  3. public class SendMessageController : ControllerBase
  4. {
  5. private readonly ILogger<SendMessageController> _logger;
  6. private readonly DaprClient _client;
  7. public SendMessageController(ILogger<SendMessageController> logger,DaprClient client )
  8. {
  9. _logger = logger;
  10. _client = client;
  11. }
  12. [HttpGet]
  13. public async Task<string> Send()
  14. {
  15. var idnumber = new Random().Next(0,99);
  16. _logger.LogInformation("正在发送");
  17. var mydata = new MyClass(idnumber,$"MyClass{idnumber}");
  18. await _client.InvokeMethodAsync<MyClass>(HttpMethod.Get,"myserver","Request",mydata);
  19. _logger.LogInformation("发送成功");
  20. return "ok";
  21. }
  22. [HttpGet("sendv2")]
  23. public async Task<string> Sendv2()
  24. {
  25. var idnumber = new Random().Next(0,99);
  26. var mydata = new MyClass(idnumber,$"MyClass{idnumber}");
  27. _logger.LogInformation("正在发送");
  28. var client = DaprClient.CreateInvokeHttpClient(appId: "myserver");
  29. _logger.LogInformation("发送成功");
  30. // http的方式
  31. var response = await client.PostAsJsonAsync("/Request/v2", mydata);
  32. if (response.IsSuccessStatusCode)
  33. {
  34. return "ok";
  35. }else{
  36. return "bad";
  37. }
  38. }
  39. [HttpGet("sendv3")]
  40. public async Task<string> Sendv3()
  41. {
  42. var idnumber = new Random().Next(0,99);
  43. var mydata = new MyClass(idnumber,$"MyClass{idnumber}");
  44. var client = DaprClient.CreateInvokeHttpClient(appId: "myserver");
  45. // http的方式
  46. var response = await client.PostAsJsonAsync("/Request/v3", mydata);
  47. if (response.IsSuccessStatusCode)
  48. {
  49. var newdata = await response.Content.ReadFromJsonAsync<MyClass>();
  50. _logger.LogInformation($"得到服务器端处理的新数据:{newdata.Id} {newdata.Name}");
  51. return JsonConvert.SerializeObject(newdata);
  52. }else{
  53. return "bad";
  54. }
  55. }
  56. public class MyClass
  57. {
  58. public MyClass(){}
  59. public MyClass(int id,string name)
  60. {
  61. Id = id;
  62. Name = name;
  63. }
  64. public int Id { get; set; }
  65. public string Name { get; set; }
  66. }
  67. }

创建服务端项目(InvokeMethodServer)


在Program类中设置日志控制台输出,在 launchSettings.json 设置运行的端口为5000

  1. public static IHostBuilder CreateHostBuilder(string[] args) =>
  2. Host.CreateDefaultBuilder(args)
  3. .ConfigureLogging(logging =>
  4. {
  5. logging.ClearProviders();
  6. logging.AddConsole();
  7. logging.AddDebug();
  8. })
  9. .ConfigureWebHostDefaults(webBuilder =>
  10. {
  11. webBuilder.UseStartup<Startup>();
  12. });
  1. {
  2. "profiles": {
  3. "InvokeMethod": {
  4. "commandName": "Project",
  5. "launchBrowser": true,
  6. "launchUrl": "weatherforecast",
  7. "applicationUrl": "http://localhost:5000",
  8. "environmentVariables": {
  9. "ASPNETCORE_ENVIRONMENT": "Development"
  10. }
  11. }
  12. }
  13. }


安装dapr的依赖包 Dapr.AspNetCore

  1. Install-Package Dapr.AspNetCore
  2. # or
  3. dotnet add package Dapr.AspNetCore


安装json序列化的包(Newtonsoft.Json)

  1. Install-Package Newtonsoft.Json
  2. # or
  3. dotnet add package Newtonsoft.Json


安装Dapr服务

  1. services.AddControllers().AddDapr();


接着定义RequestController控制器与客户端相对应的请求处理方法

  1. [ApiController]
  2. [Route("[controller]")]
  3. public class RequestController : ControllerBase
  4. {
  5. private readonly ILogger<RequestController> _logger;
  6. public RequestController(ILogger<RequestController> logger)
  7. {
  8. _logger = logger;
  9. }
  10. [HttpGet]
  11. public void Get(MyClass mydata)
  12. {
  13. _logger.LogInformation($"Server Finish! Result: {mydata.Id} {mydata.Name}");
  14. }
  15. [HttpPost("v2")]
  16. public void GetV2(MyClass mydata)
  17. {
  18. _logger.LogInformation($"Server Finish v2 ! Result: {mydata.Id} {mydata.Name}");
  19. }
  20. [HttpPost("v3")]
  21. public Task<MyClass> GetV3(MyClass mydata)
  22. {
  23. _logger.LogInformation($"Server Get Data v3 ! Data: {mydata.Id} {mydata.Name}");
  24. mydata.Id = new Random().Next(1,99);
  25. mydata.Name = "From My Server Data";
  26. _logger.LogInformation($"Server Updata Data: {mydata.Id} {mydata.Name}");
  27. return Task.FromResult(mydata);
  28. }
  29. public class MyClass
  30. {
  31. public MyClass(){}
  32. public MyClass(int id,string name)
  33. {
  34. Id = id;
  35. Name = name;
  36. }
  37. public int Id { get; set; }
  38. public string Name { get; set; }
  39. }
  40. }

运行测试

  1. # 客户端运行
  2. dapr run --app-id myclient --app-port 5001 --dapr-http-port 3501 -- dotnet run
  3. # 服务器端运行
  4. dapr run --app-id myserver --app-port 5000 --dapr-http-port 3500 -- dotnet run


通过dapr list查看运行列表


测试方法

  1. dapr invoke --app-id myclient --method SendMessage --verb GET
  2. dapr invoke --app-id myclient --method SendMessage/sendv2 --verb GET
  3. dapr invoke --app-id myclient --method SendMessage/sendv3 --verb GET


或者以http请求的方式进行访问

  1. curl http://localhost:3501/v1.0/invoke/myclient/method/SendMessage
  2. curl http://localhost:3501/v1.0/invoke/myclient/method/SendMessage/sendv2
  3. curl http://localhost:3501/v1.0/invoke/myclient/method/SendMessage/sendv3


客户端请求信息


服务器端处理信息

示例中的参数与描述

dapr run的参数

参数 默认 描述
—app-id, -a 您的应用程序的 id,用于服务发现
—app-max-concurrency unlimited 应用的并发级别,否则为无限制
—app-port, -p 您的应用程序正在侦听的端口
—app-protocol, -P http Dapr 用于与应用程序通信的协议(gRPC 或 HTTP)。有效值为:http或grpc
—app-ssl false Dapr 调用应用程序时启用 https
—components-path, -d Linux & Mac:$HOME/.dapr/components, Windows: %USERPROFILE%\.dapr\components 组件目录的路径
—config, -c Linux & Mac: $HOME/.dapr/config.yaml, Windows: %USERPROFILE%\.dapr\config.yaml Dapr 配置文件
—dapr-grpc-port 50001 Dapr 监听的 gRPC 端口
—dapr-http-port 3500 Dapr 监听的 HTTP 端口
—enable-profiling false pprof通过 HTTP 端点启用分析
—help, -h 打印此帮助消息
—image 用于构建代码的图像。输入是: repository/image
—log-level info 日志详细程度。有效值是:debuginfowarnerrorfatal,或者panic
—placement-host-address localhost 安置服务的地址。格式< hostname >适用于默认端口(6050在 Windows 上,50005在 Linux/MacOS 上)或< hostname >:< port >自定义端口
—profile-port 7777 配置文件服务器侦听的端口
—dapr-http-max-request-size 4 请求正文的最大大小(以 MB 为单位)。

dapr invoke的参数

参数 默认 描述
—app-id, -a 要调用的应用程序 ID
—help, -h 打印此帮助消息
—method, -m 调用的方法
—data, -d JSON 序列化数据字符串(可选)
—data-file, -f 包含 JSON 序列化数据的文件(可选)
—verb, -v POST 要使用的 HTTP 动词

欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价

反射调用方法给方法提供泛型,动态提供泛型参数

有些时候需要把泛型当做参数来进行传递,直接传递是不行的,这个时候我们就可以通过反射来调用。首先反射可以拿到某个属性...

.net 6.net core跨控制器调用方法控制器调用其他控制器方法

使用依赖注入的方式获取先把控制器注入 services.AddTransient&lt;MessageApiController, MessageApiController&gt;(); ...

net core 使用 EF Code First

下面这些内容很老了看这篇:https://www.tnblog.net/aojiancc2/article/details/5365 项目使用多层,把数据库访问...

.net mvc分部页,.net core分部页

.net分部页的三种方式第一种:@Html.Partial(&quot;_分部页&quot;)第二种:@{ Html.RenderPartial(&quot;分部页&quot;);}...

StackExchange.Redis操作redis(net core支持)

官方git开源地址https://github.com/StackExchange/StackExchange.Redis官方文档在docs里边都是官方的文档通过nuget命令下...

.net core 使用session

tip:net core 2.2后可以直接启用session了,不用在自己添加一次session依赖,本身就添加了使用nuget添加引用Microsoft.AspN...

通俗易懂,什么是.net?什么是.net Framework?什么是.net core?

朋友圈@蓝羽 看到一篇文章写的太详细太通俗了,搬过来细细看完,保证你对.NET有个新的认识理解原文地址:https://www.cnblo...

asp.net core2.0 依赖注入 AddTransient与AddScoped的区别

asp.net core主要提供了三种依赖注入的方式其中AddTransient与AddSingleton比较好区别AddTransient瞬时模式:每次都获取一...

.net core 使用 Kestrel

Kestrel介绍 Kestrel是一个基于libuv的跨平台web服务器 在.net core项目中就可以不一定要发布在iis下面了Kestrel体验可以使...

net core中使用cookie

net core中可以使用传统的cookie也可以使用加密的cookieNET CORE中使用传统cookie设置:HttpContext.Response.Cookies.Appe...

net core项目结构简单分析

一:wwwrootwwwroot用于存放网站的静态资源,例如css,js,图片与相关的前端插件等lib主要是第三方的插件,例如微软默认引用...

net core使用EF之DB First

一.新建一个.net core的MVC项目新建好项目后,不能像以前一样直接在新建项中添加ef了,需要用命令在添加ef的依赖二.使用Nug...

.net core使用requestresponse下载文件下载excel等

使用request获取内容net core中request没有直接的索引方法,需要点里边的Query,或者formstringbase64=Request.Form[&quot;f...

iframe自适应高度与配合net core使用

去掉iframe边框frameborder=&quot;0&quot;去掉滚动条scrolling=&quot;no&quot;iframe 自适应高度如果内容是固定的,那么就...

net core启动报错Unable to configure HTTPS endpoint. No server certificate was specified

这是因为net core2.1默认使用的https,如果使用Kestrel web服务器的话没有安装证书就会报这个错其实仔细看他的错误提示,其...
这一世以无限游戏为使命!
排名
2
文章
657
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 : 好是好,这个对效率影响大不大哇,效率高不高
ASP.NET Core 服务注册生命周期
剑轩 : http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术