使用Dapr 客户端 处理服务调用,需要遵循的他的模式,通常代码是这个样子的:

var client = DaprClient.CreateInvokeHttpClient(appId: "routing");
var response = await client.GetAsJsonAsync($"/accounts/{17}", cancellationToken);
var account = await response.Content.ReadFromJsonAsync<Account>(cancellationToken: cancellationToken);

我更希望是这样子调用:

public interface IBank

{
            [HttpGet("/accounts/{accountId}")]
            Task<Account> GetUser(string accountId, CancellationToken cancellationToken = default);

[HttpPost("/deposit")]
            Task<Account> Deposit([JsonContent] Transaction transaction, CancellationToken cancellationToken = default);

[HttpPost("/withdraw")]
            [RawReturn(Enable =true, EnsureSuccessStatusCode = false)]
            Task<HttpResponseMessage> Withdraw([JsonContent] Transaction transaction, CancellationToken cancellationToken = default);

}

var account = await bankClient.GetUser("17", cancellationToken);

我们可以用 RefitRestEase 或者是 WebApiClientCore 来达到这样的效果, 那么在Dapr 里面使用这些库如何做到呢, 在Dapr的客户端库里面有一个Handler 的官方实现:InvocationHandler。 搭配这个InvocationHandler 就可以和这几个库,在本文中,我们重点介绍Dapr Client 如何搭配 WebApiClientCore

public interface IBank
{
          [HttpGet("/accounts/{accountId}")]
          Task<Account> GetUser(string accountId, CancellationToken cancellationToken = default);

[HttpPost("/deposit")]
          Task<Account> Deposit([JsonContent] Transaction transaction, CancellationToken cancellationToken = default);

[HttpPost("/withdraw")]
          [RawReturn(Enable =true, EnsureSuccessStatusCode = false)]
          Task<HttpResponseMessage> Withdraw([JsonContent] Transaction transaction, CancellationToken cancellationToken = default);
}

public class WebapiClientExample : Example
   {
       public override string DisplayName => "WebapiClient";

private IBank bankClient;

public WebapiClientExample(IBank bank)
       {
           bankClient = bank;
       }

public override async Task RunAsync(CancellationToken cancellationToken)
       {
           var options = new JsonSerializerOptions(JsonSerializerDefaults.Web);

// Scenario 1: Check if the account already exists.
           Account? account = null;
           try
           {
               account = await bankClient.GetUser("17", cancellationToken);
           }
           catch (ApiException ex)
           {
               // Account does not exist.
           }

Console.WriteLine($"Scenario 1: account '17' {(account is null ? "does not exist" : "already exists")}");

// Scenario 2: Deposit some money
           var transaction = new Transaction()
           {
               Amount = 100m,
               Id = "17",
           };

// read updated balance
           account = await bankClient.Deposit(transaction, cancellationToken);
           Console.WriteLine($"Scenario 2: account '17' has '{account?.Balance}' money");

// Scenario 3: Handle a validation error without exceptions
           transaction = new Transaction()
           {
               Amount = 1_000_000m,
               Id = "17",
           };
           HttpResponseMessage response = null;

response = await bankClient.Withdraw(transaction, cancellationToken);
           if (response.StatusCode != HttpStatusCode.BadRequest)
           {
               // We don't actually expect this example to succeed - we expect a 400
               Console.WriteLine("Something went wrong :(");
               return;
           }
           var problem = await response.Content.ReadFromJsonAsync<ProblemDetails>(cancellationToken: cancellationToken);
           Console.WriteLine($"Scenario 3: got the following errors:");
           foreach (var kvp in problem!.Errors)
           {
               Console.WriteLine($"{kvp.Key}: {string.Join(", ", kvp.Value)}");
           }
       }
   }

var services = new ServiceCollection();
             services.AddTransient<Example, WebapiClientExample>();
             services.AddLogging();

services
                 .AddScoped<InvocationHandler>()
                 .AddHttpApi<WebapiClientExample.IBank>(o => o.HttpHost = new Uri("http://bank"))
                 .AddHttpMessageHandler<InvocationHandler>();
            var serviceprovider = services.BuildServiceProvider();

代码的核心部分就在于上面红色的部分,我们把InvocationHandler 加入到AddHttpApi ,就可以和 dapr 一起玩耍了。

最新文章

  1. WCF、Web API、WCF REST、Web Service比较
  2. [书目20160526]Brain Rules 让大脑自由:释放天赋的12条定律
  3. Android LayoutInflater详解 (转)
  4. 如何用ActiveQt写导出类
  5. linux应用程序开发-文件编程-库函数
  6. ArrayList、HashTable、List、Dictionary的演化及如何选择使用
  7. Linux中常用的查看系统信息的命令
  8. 夺命雷公狗ThinkPHP项目之----企业网站3之后台栏目页的搭建(百度编辑器的引入)
  9. 【leetcode❤python】 36. Valid Sudoku
  10. jQuery.FlexiGrid使用总结
  11. HW5.9
  12. birt 运行环境搭建(部署到tomcat)
  13. Linux的时钟管理
  14. Tomcat 中会话超时的相关配置
  15. fopen()函数中参数mode的取值
  16. Client与Server
  17. ASP.NET Core 2.0 SignalR 示例
  18. DotNetty网络通信框架学习
  19. net.sf.json
  20. JS中this的四种用法

热门文章

  1. VBS脚本编程(10)——编写WMI脚本
  2. Linux mlocate源码分析:updatedb
  3. pip安装setuptools_rust报错
  4. 温故知新,.Net Core遇见Postman(API Development),进阶分布式微服务高效调式
  5. 23、swap分区扩充
  6. 徒手从零实现 uTools 系列(三)- 屏幕取色和截屏
  7. POJ 2947 2947 Widget Factory 高斯消元
  8. [心得]redis集群环境搭建的错误
  9. svn创建新分支报错:svn: E155015: Aborting commit: XXX remains in conflict
  10. spring cloud服务器启动之后立刻通过zuul访问其中的实例报zuul连接超时的问题