<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      netcore grpc

      netcore grpc

      一、solution

      1. 創建空解決方案
         > dotnet new sln -n Apricot.Grpc
        

      二、Grpc.Server

      1. 創建Apricot.Grpc類庫項目
         > dotnet new classlib -n Apricot.Grpc
        
         # 解決方案添加類庫項目
         > dotnet sln add Apricot.Grpc/Apricot.Grpc.csproj
        
      2. 安裝依賴
         > dotnet add package Grpc.AspNetCore --version 2.66.0
         > dotnet add package protobuf-net --version 3.2.30
        
      3. 創建Protos文件夾
        • 添加Garner文件夾,包含增、刪、改、查 等操作
        • 添加 garner.proto 文件 [主文件]
          syntax = "proto3";
          option csharp_namespace = "Apricot.Grpc";
          
          package garner;
          
          // google protos
          import "google/protobuf/empty.proto";
          import "google/protobuf/Any.proto";
          
          // garner protos
          import "Protos/Garner/create.proto";
          import "Protos/Garner/update.proto";
          import "Protos/Garner/get.proto";
          import "Protos/Garner/list.proto";
          
          // params protos
          import "Protos/Params/id.proto";
          import "Protos/Params/query.proto";
          
          // results protos
          import "Protos/Results/result.proto";
          
          // services
          service Garner{
              rpc CreateAsync(CreateGarnerRequest) returns(RcpResult);
          
              rpc UpdateAsync(UpdateGarnerRequest) returns(RcpResult);
          
              rpc RemoveAsync(IdParam) returns(RcpResult);
          
              rpc GetAsync(IdParam) returns(GetGarnerResponse);
          
              rpc GetListAsync(QueryParam) returns(GetGarnerListResponse);
          }
          
          
        • 添加 create.proto 文件
          syntax = "proto3";
          
          option csharp_namespace = "Apricot.Grpc";
          
          package garner;
          
          // google empty.proto
          import "google/protobuf/empty.proto";
          
          // create request
          message CreateGarnerRequest{
              string name = 2;
          
              string address = 3;
          }
          
        • 添加 update.proto 文件
          syntax = "proto3";
          
          option csharp_namespace = "Apricot.Grpc";
          
          package garner;
          
          // google empty.proto
          import "google/protobuf/empty.proto";
          
          // update request
          message UpdateGarnerRequest{
              int64 id = 1;
          
              string name = 2;
          
              string address = 3;
          
          }
          
        • 添加 get.proto 文件
          syntax = "proto3";
          
          option csharp_namespace = "Apricot.Grpc";
          
          
          package garner;
          
          // google empty.proto
          import "google/protobuf/empty.proto";
          
          // garner response
          message GetGarnerResponse{
              int32 code = 1;
              string message = 2;
              bool success = 3;
              oneof garner{
                  GetGarnerData data =4;
              }
          }
          
          // garner data
          message GetGarnerData{
              int64 id = 1;
          
              string name = 2;
          
              string address = 3;
          
          }
          
          
        • 添加 list.proto 文件
          syntax = "proto3";
          
          option csharp_namespace = "Apricot.Grpc";
          
          package garner;
          
          // google empty.proto
          import "google/protobuf/empty.proto";
          
          // garner list response
          message GetGarnerListResponse{
              int32 code = 1;
              string message = 2;
              bool success = 3;
              int32 total = 4;
              repeated GetGarnerListData rows = 5;
          }
          
          // garner list data
          message GetGarnerListData{
              int64 id = 1;
          
              string name = 2;
          
              string address = 3;
          
          }
          
      4. 項目文件添加 .proto 配置
        <ItemGroup>
          <Protobuf Include="Protos\Results\result.proto" />
          <Protobuf Include="Protos\Params\query.proto" />
          <Protobuf Include="Protos\Params\id.proto" />
          <Protobuf Include="Protos\Garner\get.proto" />
          <Protobuf Include="Protos\Garner\list.proto" />
          <Protobuf Include="Protos\Garner\update.proto" />
          <Protobuf Include="Protos\Garner\create.proto" />
          <Protobuf Include="Protos\Garner\garner.proto" GrpcServices="Server" />
         </ItemGroup>
        
      5. 編譯項目
         > dotnet build
        
      6. 查看生成類
         > dir obj\Debug\net8.0\Protos
        
      7. 創建 grpc service
        • 創建 GarnerGrpcService
        • 繼承 Garner.GarnerBase
        • 重寫方法
        • 整體代碼
           public class GarnerGrpcService : Garner.GarnerBase
           {
             public override Task<RcpResult> CreateAsync(CreateGarnerRequest request, ServerCallContext context)
             {
                 return Task.FromResult(new RcpResult
                 {
                     Code = StatusCodes.Status200OK,
                     Success = true,
                 });
             }
          
             public override Task<RcpResult> UpdateAsync(UpdateGarnerRequest request, ServerCallContext context)
             {
                 return Task.FromResult(new RcpResult
                 {
                     Code = StatusCodes.Status200OK,
                     Success = true,
                 });
             }
          
             public override Task<RcpResult> RemoveAsync(IdParam request, ServerCallContext context)
             {
                 return Task.FromResult(new RcpResult
                 {
                     Code = StatusCodes.Status200OK,
                     Success = true,
                 });
             }
          
             public override Task<GetGarnerResponse> GetAsync(IdParam request, ServerCallContext context)
             {
                 return Task.FromResult(new GetGarnerResponse
                 {
                     Code = StatusCodes.Status200OK,
                     Success = true,
                     Data = new GetGarnerData
                     {
                         Id = Random.Shared.NextInt64(),
                         Address = "127.0.0.1",
                         Name = "garner"
                     }
                 });
             }
          
             public override Task<GetGarnerListResponse> GetListAsync(QueryParam request, ServerCallContext context)
             {
                 var response = new GetGarnerListResponse
                 {
                     Code = StatusCodes.Status200OK,
                     Success = true,
                     Total = 10,
                 };
          
                 response.Rows.AddRange(new[]
                 {
                     new GetGarnerListData
                     {
                         Id = Random.Shared.NextInt64(),
                         Address = "127.0.0.1",
                         Name = "garner"
                     },
                     new GetGarnerListData
                     {
                         Id = Random.Shared.NextInt64(),
                         Address = "127.0.0.1",
                         Name = "apricot"
                     }
                 });
          
                 return Task.FromResult(response);
             }
          }
          

      三、Grpc.WebApi

      1. 創建Apricot.Grpc.WebApi啟動項目
         > dotnet new web -n Apricot.Grpc.WebApi
        
         # 解決方案添加啟動項目
         > dotnet sln add Apricot.Grpc.WebApi/Apricot.Grpc.WebApi.csproj
        
      2. 添加項目引用
         > dotnet add reference ../Apricot.Grpc/Apricot.Grpc.csproj
        
      3. 注入容器、管道
         // add grpc
         builder.Services.AddGrpc();
        
         // map grpc
         app.MapGrpcService<GarnerGrpcService>();
        
      4. 協議配置
        {
         "Logging": {
             "LogLevel": {
             "Default": "Information",
             "Microsoft.AspNetCore": "Warning"
             }
         },
         "AllowedHosts": "*",
        
         // setting  http2 protocol
         "Kestrel": {
             "EndpointDefaults": {
              "Protocols": "Http2"
             }
         }
        }
        
        builder.WebHost.ConfigureKestrel(options =>
         {
             // http2
             options.ListenAnyIP(5132, listenOption =>
             {
                 listenOption.Protocols = Microsoft.AspNetCore.Server.Kestrel.Core.HttpProtocols.Http2;
             });
        
             // http1
             options.ListenAnyIP(5133, listenOption =>
             {
                 listenOption.Protocols = Microsoft.AspNetCore.Server.Kestrel.Core.HttpProtocols.Http1;
             });
         });
        
      5. 啟動項目
         > dotnet run
        

      四、Grpc.Client

      1. 創建Apricot.Grpc.Client項目
         > dotnet new web -n Apricot.Grpc.Client
        
         # 解決方案添加客戶端
         > dotnet sln add Apricot.Grpc.WebApi/Apricot.Grpc.Client.csproj
        
      2. 安裝依賴
         > dotnet add package Grpc.Net.Client --version 2.66.0
         > dotnet add package Google.Protobuf --version 3.28.2
         > dotnet add package Grpc.Tools --version 2.67.0
         > dotnet add package Grpc.Net.ClientFactory --version 2.66.0
         > dotnet add package protobuf-net --version 3.2.30
        
      3. 復制 Protos 文件夾至 Apricot.Grpc.Client項目
      4. 添加 .proto 項目配置
         <ItemGroup>
         	<Protobuf Include="Protos\Results\result.proto" />
         	<Protobuf Include="Protos\Params\query.proto" />
         	<Protobuf Include="Protos\Params\id.proto" />
         	<Protobuf Include="Protos\Garner\get.proto" />
         	<Protobuf Include="Protos\Garner\list.proto" />
         	<Protobuf Include="Protos\Garner\update.proto" />
         	<Protobuf Include="Protos\Garner\create.proto" />
         	<Protobuf Include="Protos\Garner\garner.proto" GrpcServices="Client" />
         </ItemGroup>
        
      5. 編譯項目
         > dotnet build
        
      6. 注入容器
        // add client
        builder.Services.AddGrpcClient<Garner.GarnerClient>(option =>
         {
             option.Address = new Uri("http://localhost:5132");
         })
        
      7. 服務調用
         app.Map("/grpc", (HttpContext context) =>
         {
        
             var client = context.RequestServices.GetRequiredService<Garner.GarnerClient>();
        
             var data = client.GetListAsync(new QueryParam { PageIdex = 1, PageSize = 10 });
        
             context.Response.WriteAsJsonAsync(data);
        
         });
        

      五、apifox 聯調 grpc

      1. 個人團隊
      2. 新建項目
        • 類型 grpc 項目
      3. 添加 .proto
        • .proto 文件

          • 選擇 garner.proto 主文件
        • 依賴關系目錄

          • 選擇 Protos 文件夾
        • 錯誤 & 處理

          • 錯誤:未找到 google protobuf

          • 處理:將 google protobuf 拷貝 Protos 目錄

            • 目錄:%USERPROFILE%.nuget\packages\grpc.tools\2.66.0\build\native\include\google
            • 附圖:
          • 錯誤:未找到 create.proto

            • 處理:將 garner.protoimport 去掉 Protos/ (僅限導入)
            • 附圖:
        • 導入成功

      4. 接口測試 create、list
        • create
        • list
        • 錯誤 & 處理
          • 錯誤:Received RST_STREAM with code 2 triggered by internal client error: Protocol error
          • 處理:將請求地址改成 Http2 協議端口。
      posted @ 2024-10-19 17:07  1764564459  閱讀(29)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 五月综合网亚洲乱妇久久| 免费无遮挡毛片中文字幕| 国内揄拍国内精品人妻| 色综合视频一区二区三区| 97av麻豆蜜桃一区二区| 日韩av在线不卡一区二区| 国产mv在线天堂mv免费观看| 水蜜桃视频在线观看免费18| 国产sm调教折磨视频| 日本一区二区三区激情视频| 国产成人精品无码播放| 老师扒下内裤让我爽了一夜| 中文字幕 日韩 人妻 无码| 无遮无挡爽爽免费视频| 无码人妻aⅴ一区二区三区蜜桃| 欧美孕妇乳喷奶水在线观看| 鲁一鲁一鲁一鲁一澡| 另类 专区 欧美 制服| 国产成年码AV片在线观看| 亚洲国产欧美一区二区好看电影| 神马久久亚洲一区 二区| 亚洲成aⅴ人在线观看| 亚洲精品日韩在线观看| 老司机精品成人无码AV| 少妇办公室好紧好爽再浪一点| 同心县| 无码视频一区二区三区| 亚洲欧美日韩综合久久久| 色av永久无码影院av| 日本一区二区三区东京热| 亚洲AVAV天堂AV在线网阿V| 亚洲av成人一区在线| 日韩V欧美V中文在线| 1区2区3区4区产品不卡码网站 | 国产精品∧v在线观看| 少妇私密会所按摩到高潮呻吟 | 少妇激情av一区二区三区| 国产成人精品视频不卡| 日韩丝袜欧美人妻制服| 四虎影院176| 亚洲色大成网站WWW永久麻豆|