首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在码头集装箱中运行.net核心grpc?

问如何在码头集装箱中运行.net核心grpc?
EN

Stack Overflow用户
提问于 2020-12-22 08:08:44
回答 2查看 2.1K关注 0票数 0

嗨,我使用.Net 5创建了GRPC项目。下面是我的Docker文件。

代码语言:javascript
复制
FROM mcr.microsoft.com/dotnet/aspnet:5.0-buster-slim AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/sdk:5.0-buster-slim AS build
WORKDIR /src
COPY ./*.sln ./
COPY */*.csproj ./
RUN for file in $(ls *.csproj); do mkdir -p ${file%.*} && mv $file ${file%.*}; done
RUN dotnet restore
COPY . .
WORKDIR "/src/Geography"
RUN dotnet build "Geography.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "Geography.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "Geography.dll"]

我试图使用Docker在visual studio中运行解决方案,然后看到容器正在启动和运行。我看到下面的港口暴露了。

代码语言:javascript
复制
 0.0.0.0:32775->80/tcp, 0.0.0.0:32774->443/tcp

我创建了客户端应用程序,并尝试按以下方式到达grpc端点。

代码语言:javascript
复制
using var channel = GrpcChannel.ForAddress("http://localhost:32774");
var client = new Geographys.GeographysClient(channel);

在这里,我得到了下面的错误

状态(StatusCode=“StatusCode=”,Detail=“启动gRPC调用时出错。HttpRequestException:发送请求时发生错误。IOException:无法从传输连接读取数据:现有连接被远程主机强制关闭. SocketException:现有连接被远程主机强制关闭。”,在发送请求时发生错误。--> System.IO.IOException:无法从传输连接读取数据:现有连接被远程主机强制关闭.->

有人能帮我了解一下这个问题的根源吗?任何帮助都将不胜感激。谢谢

EN

回答 2

Stack Overflow用户

发布于 2020-12-23 02:45:10

您是否确信您的.NET代码在容器端口80上公开了一个非TLS HTTP端点,在443上公开了一个TLS HTTP端点。

我怀疑它不是,这将解释为什么当端口绑定到主机时(分别在32775和32774上)无法通过端口访问服务。

注意,您的客户端代码尝试访问http://localhost:32774,这可能映射到容器的TLS端点(:443),因此您需要使用https://并配置证书。

如果在主机上运行Linux,可以尝试对这些端口进行telnet‘’ing,以查看是否得到响应:

代码语言:javascript
复制
telnet localhost 32775
telnet localhost 32774

如果您有gRPCurl (对于任何gRPC开发您都应该使用gRPC),您可以尝试列出方法:

代码语言:javascript
复制
grpcurl \
-plaintext \
-proto path/to/your.proto \
localhost:32775 \
list

grpcurl \
-plaintext \
-proto path/to/your.proto \
localhost:32774 \
list

注意:,我认为这是TLS和非TLS的正确grpcurl,但是编写时不能测试

票数 0
EN

Stack Overflow用户

发布于 2021-10-04 15:43:03

添加以下代码

代码语言:javascript
复制
"Kestrel": {
    "EndpointDefaults": {
      "Protocols": "Http2"
    }
  }

在appsettings.json服务器端的gRPC文件中,调用'http‘端口而不是在gRPC客户端调用'https’就可以了。在您的例子中,应该是:

代码语言:javascript
复制
using var channel = GrpcChannel.ForAddress("http://localhost:32775");
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65405148

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档