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

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

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

      netcore vue grpc、http grpc

      netcore vue grpc、http grpc

      vue 前端

      一、項(xiàng)目準(zhǔn)備

      1. 創(chuàng)建 vue 項(xiàng)目
        $ cd E:\code
        
        # 創(chuàng)建 vue 項(xiàng)目
        $ vue create apricot-grpc
           -> 1、選擇 Vue3
        
      2. 安裝依賴
        $ npm install grpc-web --save
        
        $ npm install google-protobuf --save
        
      3. 安裝 proto 轉(zhuǎn)換依賴
        $ npm install -g protoc-gen-js protoc-gen-grpc-web grpc-tools
        

      二、Proto 文件轉(zhuǎn)換

      1. 復(fù)制 proto 文件

        • 后端 proto
        • Protos 文件夾復(fù)制至 src 目錄下
      2. 查看全局目錄地址

        $ npm config get prefix
        
      3. 找到 protoc.exe

      4. 生成 js 文件

        • 將所有項(xiàng)目需要 .proto 轉(zhuǎn)換成 .js
          # 轉(zhuǎn)到 src 目錄
          $ cd .\aproct-grpc\src
          
          # 創(chuàng)建 grpc-proto-js 目錄(輸出js目錄)
          $ mkdir grpc-proto-js
          
          # 生成 file_grpc_web_pb.js、file_pb.js
          $ D:\nodejs\node_modules\grpc-tools\bin\protoc.exe --proto_path=. --js_out=import_style=commonjs,binary:./grpc-proto-js/ --grpc-web_out=import_style=commonjs,mode=grpcwebtext:./grpc-proto-js/ .\Protos\File\file.proto
          
          # 生成  google\protobuf\empty_pb.js
          $ D:\nodejs\node_modules\grpc-tools\bin\protoc.exe --proto_path=. --js_out=import_style=commonjs,binary:./grpc-proto-js/ --grpc-web_out=import_style=commonjs,mode=grpcwebtext:./grpc-proto-js/ .\Protos\google\protobuf\empty.proto
          
          # 生成  Params\id_pb.js
          $ D:\nodejs\node_modules\grpc-tools\bin\protoc.exe --proto_path=. --js_out=import_style=commonjs,binary:./grpc-proto-js/ --grpc-web_out=import_style=commonjs,mode=grpcwebtext:./grpc-proto-js/ .\Protos\Params\id.proto   
          
          # 生成  Params\query_pb.js
          $ D:\nodejs\node_modules\grpc-tools\bin\protoc.exe --proto_path=. --js_out=import_style=commonjs,binary:./grpc-proto-js/ --grpc-web_out=import_style=commonjs,mode=grpcwebtext:./grpc-proto-js/ .\Protos\Params\query.proto   
          
          # 生成  Results\result_pb.js
          $ D:\nodejs\node_modules\grpc-tools\bin\protoc.exe --proto_path=. --js_out=import_style=commonjs,binary:./grpc-proto-js/ --grpc-web_out=import_style=commonjs,mode=grpcwebtext:./grpc-proto-js/ .\Protos\Results\result.proto   
          
        • proto_path:proto 文件地址
        • mode:請(qǐng)求數(shù)據(jù)類(lèi)型(Content-Type
        • grpc-proto-js:生成 .js 輸出目錄
      5. 使用 grpc

        <template>
         <div class="hello">
           <label for="grpc api">grpc api</label>:
           <input
              name="refulapi"
              type="button"
              value="grpc api"
              v-on:click="onGrpcApi"
           />
         </div>
        </template>
        
        <script>
          import { Empty } from "../grpc-proto-js/Protos/google/protobuf/empty_pb";
          import { FileServiceClient } from "../grpc-proto-js/Protos/File/file_grpc_web_pb";
        
           export default {
              name: "HelloWorld",
              props: {
                 msg: String,
              },
              methods: {
                 // eslint-disable-next-line
                 onGrpcApi(event) {
                    const client = new FileServiceClient("http://localhost:5211", null, null);
        
                    // eslint-disable-next-line
                    client.readFileAsync(new Empty(), {}, (err, response) => {
                       console.log(response);
                    });
                 },
              
              },
           };
        </script>
        
      6. 啟動(dòng)項(xiàng)目

        $ npm run serve
        
        • 可能會(huì)出現(xiàn)錯(cuò)誤:not found Any_pb.js
        • 附圖:
        • 解決:將 grpc-proto-js 下相關(guān)引用 Any_pb.js 改成 any_pb.js
      7. 請(qǐng)求跨域

      8. 待續(xù)

      三、grpc http

      1. http 請(qǐng)求
        <template>
         <div class="hello">
            <label for="reful api">grpc http api</label>:
            <input
               name="refulapi"
               type="button"
               value="grpc http api"
               v-on:click="onGrpcHttpApi"
            />
        </template>
        
        <script>
          import { Empty } from "../grpc-proto-js/Protos/google/protobuf/empty_pb";
          import { FileServiceClient } from "../grpc-proto-js/Protos/File/file_grpc_web_pb";
        
           export default {
              name: "HelloWorld",
              props: {
                 msg: String,
              },
              methods: {
                 // eslint-disable-next-line
                 onGrpcHttpApi(event) {
                    var xhr = new XMLHttpRequest();
        
                    xhr.responseType = "json";
        
                    xhr.addEventListener("readystatechange", function () {
                    // eslint-disable-next-line
                    if (this.readyState === 4) {
                       console.log(this.response.data);
                    }
                    });
        
                    //設(shè)置請(qǐng)求
                    xhr.open("get", "http://localhost:5211/v1/electron/getbase64");
                    xhr.setRequestHeader("Content-Type", "application/json");
        
                    xhr.send();
                 },
              }
           };
        </script>
        
      2. 待續(xù)

      后端

      一、grpc proxy

      1. 創(chuàng)建項(xiàng)目
      2. 安裝依賴
        > dotnet add package Grpc.AspNetCore --version 2.71.0
        > dotnet add package protobuf-net --version 3.2.56
        > dotnet add package Yarp.ReverseProxy --version 2.3.0
        
      3. 創(chuàng)建 Proto
        • 跳過(guò),參考上文
      4. 創(chuàng)建服務(wù)
        /// <summary>
        /// Grcp service
        /// </summary>
        public class FileService : Electron.Grpc.FileService.FileServiceBase
        {
           public override async Task<GetBufferResponse> ReadFileAsync(Empty request, ServerCallContext context)
           {
              using var fileStream = System.IO.File.OpenRead("C:\\Users\\Administrator\\Desktop\\2fdda3cc7cd98d1001e9f6a7b36eaf0e7bec54e73a51.jpg");
        
              var memeoryStream = new MemoryStream();
        
              await fileStream.CopyToAsync(memeoryStream);
        
              var buffer = memeoryStream.ToArray();
        
              var resp = new GetBufferResponse
              {
                    Code = 200,
                    Data = Convert.ToBase64String(buffer)
              };
        
              return resp;
           }
        }
        
      5. 服務(wù)配置
        using Apricot.Grpc.Proxy.Services;
        
        var builder = WebApplication.CreateBuilder(args);
        
        // yarp proxy
        builder.Services.AddReverseProxy();
        
        // grpc
        builder.Services.AddGrpc();
        
        // cors
        builder.Services.AddCors(options =>
        {
           options.AddPolicy("AllowAll", policy =>
           {
              policy.SetIsOriginAllowed(_ => true)
                    .AllowAnyMethod()
              .AllowAnyHeader()
              .AllowCredentials()
              .WithExposedHeaders("Grpc-Status", "Grpc-Message", "Grpc-Encoding", "Grpc-Accept-Encoding", "X-Grpc-Web", "User-Agent");
           });
        });
        
        
        var app = builder.Build();
        
        // route
        app.UseRouting();
        
        // grpc web 
        app.UseGrpcWeb();
        
        app.UseCors("AllowAll");
        
        // grpc service 
        app.MapGrpcService<FileService>().EnableGrpcWeb();
        
        // frontend(http://localhost:8081) proxy
        app.MapForwarder("/electron.FileService/{**catch-all}", "http://localhost:8081");
        
        app.Run();
        
        
      6. Yarp.ReverseProxy 跨域代理
        • 未找到更優(yōu)方案,有更好方案評(píng)論區(qū)留言
        • 解決
           using Apricot.Grpc.Proxy.Services;
          
           var builder = WebApplication.CreateBuilder(args);
          
           // yarp proxy
           builder.Services.AddReverseProxy();
          
           // cors
           builder.Services.AddCors(options =>
           {
              options.AddPolicy("AllowAll", policy =>
              {
                 policy.SetIsOriginAllowed(_ => true)
                       .AllowAnyMethod()
                 .AllowAnyHeader()
                 .AllowCredentials()
                 .WithExposedHeaders("Grpc-Status", "Grpc-Message", "Grpc-Encoding", "Grpc-Accept-Encoding", "X-Grpc-Web", "User-Agent");
              });
           });
          
           var app = builder.Build();
          
           // use cors
           app.UseCors("AllowAll");
          
           // frontend(http://localhost:8081) proxy
           app.MapForwarder("/electron.FileService/{**catch-all}", "http://localhost:8081");
          
           app.Run();
          
      7. 處理 Unsupported Media Type
        • 參考
        • 解決
          // route
          app.UseRouting();
          
          // grpc web 
          app.UseGrpcWeb();
          
          // grpc service (EnableGrpcWeb)
          app.MapGrpcService<FileService>().EnableGrpcWeb();
          
      8. 待續(xù)

      二、grpc http

      1. 安裝依賴 [官網(wǎng)]
        > dotnet add package  Microsoft.AspNetCore.Grpc.JsonTranscoding --version 8.0.21
        
      2. 更改 proto 協(xié)議
        syntax = "proto3";
        option csharp_namespace = "Apricot.Electron.Grpc";
        
        package electron;
        
        // google protos
        import "google/protobuf/empty.proto";
        import "google/protobuf/Any.proto";
        import "google/api/annotations.proto";
        
        // results protos
        import "Protos/Results/result.proto";
        import "Protos/File/buffer.proto";
        
        // services
        service FileService{
        
           rpc ReadFileAsync(google.protobuf.Empty) returns(GetBufferResponse);
        
           rpc GetBase64Async(google.protobuf.Empty) returns(GetBufferResponse){
              option (google.api.http) = {
                    get: "/v1/electron/getbase64"
              };
           }
        }
        
      3. 添加服務(wù)
        /// <summary>
        /// Grcp service
        /// </summary>
        public class FileService : Electron.Grpc.FileService.FileServiceBase
        {
           public override async Task<GetBufferResponse> GetBase64Async(Empty request, ServerCallContext context)
           {
               using var fileStream = System.IO.File.OpenRead("C:\\Users\\Administrator\\Desktop\\2fdda3cc7cd98d1001e9f6a7b36eaf0e7bec54e73a51.jpg");
        
               var memeoryStream = new MemoryStream();
        
               await fileStream.CopyToAsync(memeoryStream);
        
               var buffer = memeoryStream.ToArray();
        
               var resp = new GetBufferResponse
               {
                   Code = 200,
                   Data = Convert.ToBase64String(buffer)
               };
        
               return resp;
           }
        }
        
      4. 服務(wù)配置
        using Apricot.Grpc.Proxy.Services;
        
        var builder = WebApplication.CreateBuilder(args);
        // grpc
        builder.Services.AddGrpc().AddJsonTranscoding();
        
        // cors
        builder.Services.AddCors(options =>
        {
           options.AddPolicy("AllowAll", policy =>
           {
              policy.SetIsOriginAllowed(_ => true)
                    .AllowAnyMethod()
              .AllowAnyHeader()
              .AllowCredentials()
              .WithExposedHeaders("Grpc-Status", "Grpc-Message", "Grpc-Encoding", "Grpc-Accept-Encoding", "X-Grpc-Web", "User-Agent");
           });
        });
        
        var app = builder.Build();
        
        // route
        app.UseRouting();
        
        // cors
        app.UseCors("AllowAll");
        
        // grpc service
        app.MapGrpcService<FileService>();
        
        app.Run();
        
      5. 待續(xù)

      示例項(xiàng)目

      1. [前端]
      2. [后端]
      posted @ 2025-10-25 12:15  1764564459  閱讀(8)  評(píng)論(0)    收藏  舉報(bào)
      主站蜘蛛池模板: 胸大美女又黄的网站| 麻豆成人传媒一区二区| 天美传媒一区二区| 亚洲无人区码一二三四区| 精品日本免费一区二区三区| 国产成人欧美日本在线观看| 国产一区二区三区在线观看免费| 日本黄色三级一区二区三区| 亚洲国产精品一区二区第一页| 韩国一级毛片中文字幕| 国产在线中文字幕精品| 麻豆精产国品一二三区区| 国产一二三五区不在卡| 四房播色综合久久婷婷| 亚洲大尺度无码无码专线| 亚洲精品国产无套在线观| 国产乱子伦一区二区三区视频播放| 2020年最新国产精品正在播放| 国产成人精品三上悠亚久久| 亚洲成色精品一二三区| 亚洲国产精品无码av| 人妻体内射精一区二区三四| 在线观看精品日本一区二| 丰满少妇在线观看网站| 九九成人免费视频| 国精品午夜福利不卡视频| 天天做天天爱夜夜爽导航| 一区二区三区精品视频免费播放| 午夜福利理论片高清在线| 国产欧美丝袜在线二区| 苏尼特左旗| gogogo高清在线播放免费| 男同精品视频免费观看网站| 佛坪县| 亚洲一区中文字幕第十页| 亚洲www永久成人网站| 欧美日韩中文国产一区| 亚洲综合不卡一区二区三区| 日韩有码中文字幕国产| 中文字字幕在线中文乱码| 国产午夜精品一区二区三区漫画|