【发布时间】:2022-01-21 03:30:34
【问题描述】:
我对 gRPC 进行了研究,当我使用 API 简单客户端测试与 APIGRPC 服务器的连接时,出现错误 404。 我检查了连接并检查了 JSON 文件,但我不知道问题出在哪里。
我使用 C# 和 Visual Studio 2019 我使用 Visual Studio 的连接工具进行连接
proto 文件代码
syntax = "proto3";
option csharp_namespace = "Discount.Grpc.Protos";
service DiscountProtoService {
rpc GetDiscount (GetDiscountRequest) returns (CouponModel);
rpc CreateDiscount (CreateDiscountRequest) returns (CouponModel);
rpc UpdateDiscount (UpdateDiscountRequest) returns (CouponModel);
rpc DeleteDiscount (DeleteDiscountRequest) returns (DeleteDiscountResponse);
}
message GetDiscountRequest {
string productName = 1;
}
message CouponModel {
int32 id = 1;
string productName = 2;
string description = 3;
int32 amount = 4;
}
message CreateDiscountRequest {
CouponModel coupon = 1;
}
message UpdateDiscountRequest {
CouponModel coupon = 1;
}
message DeleteDiscountRequest {
string productName = 1;
}
message DeleteDiscountResponse {
bool success = 1;
}
客户端的 JSON 代码
{
"CacheSettings": {
"ConnectionString": "localhost:6379"
},
"GrpcSettings": {
"DiscountUrl": "http://localhost:5003"
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
GRPC 服务器的 JSON 代码
{
"DatabaseSettings": {
"ConnectionString": "Server=localhost;Port=5432;Database=DiscountDb;User Id=admin;Password=admin1234;"
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"Kestrel": {
"EndpointDefaults": {
"Protocols": "Http2"
}
}
}
以及有错误的响应
Grpc.Core.RpcException: Status(StatusCode="Unimplemented", Detail="Bad gRPC response. HTTP status code: 404")
at Basket.API.GrpcServices.DiscountGrpcService.GetDiscount(String productName) in C:\Users\Matheus\Documents\dir\microservicesASPnet\src\Services\Basket\Basket.API\GrpcServices\DiscountGrpcService.cs:line 21
at Basket.API.Controllers.BasketController.UpdateBasket(ShoppingCart basket) in C:\Users\Matheus\Documents\dir\microservicesASPnet\src\Services\Basket\Basket.API\Controllers\BasketController.cs:line 41
at lambda_method5(Closure , Object )
at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.AwaitableObjectResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeActionMethodAsync>g__Awaited|12_0(ControllerActionInvoker invoker, ValueTask`1 actionResultValueTask)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeNextActionFilterAsync>g__Awaited|10_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeInnerFilterAsync>g__Awaited|13_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeFilterPipelineAsync>g__Awaited|19_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
at Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext)
at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider)
at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)
API 客户端 XML .csproj
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
<DockerfileContext>..\..\..</DockerfileContext>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Grpc.AspNetCore" Version="2.32.0" />
<PackageReference Include="Microsoft.Extensions.Caching.StackExchangeRedis" Version="6.0.1" />
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.11.1" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="5.6.3" />
</ItemGroup>
<ItemGroup>
<Protobuf Include="..\..\Discount\Discount.Grpc\Protos\discount.proto" GrpcServices="Client">
<Link>Protos\discount.proto</Link>
</Protobuf>
</ItemGroup>
</Project>
API GRPC
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
<DockerComposeProjectPath>..\..\..\docker-compose.dcproj</DockerComposeProjectPath>
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
<DockerfileContext>..\..\..</DockerfileContext>
</PropertyGroup>
<ItemGroup>
<None Remove="Protos\discount.proto" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="8.1.1" />
<PackageReference Include="Grpc.AspNetCore" Version="2.35.0" />
<PackageReference Include="Dapper" Version="2.0.78" />
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.10.13" />
<PackageReference Include="Npgsql" Version="5.0.3" />
</ItemGroup>
<ItemGroup>
<Protobuf Include="Protos\discount.proto" GrpcServices="Server" />
</ItemGroup>
</Project>
【问题讨论】: