嗨,我使用.Net 5创建了GRPC项目。下面是我的Docker文件。
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中运行解决方案,然后看到容器正在启动和运行。我看到下面的港口暴露了。
0.0.0.0:32775->80/tcp, 0.0.0.0:32774->443/tcp我创建了客户端应用程序,并尝试按以下方式到达grpc端点。
using var channel = GrpcChannel.ForAddress("http://localhost:32774");
var client = new Geographys.GeographysClient(channel);在这里,我得到了下面的错误
状态(StatusCode=“StatusCode=”,Detail=“启动gRPC调用时出错。HttpRequestException:发送请求时发生错误。IOException:无法从传输连接读取数据:现有连接被远程主机强制关闭. SocketException:现有连接被远程主机强制关闭。”,在发送请求时发生错误。--> System.IO.IOException:无法从传输连接读取数据:现有连接被远程主机强制关闭.->
有人能帮我了解一下这个问题的根源吗?任何帮助都将不胜感激。谢谢
发布于 2020-12-23 02:45:10
您是否确信您的.NET代码在容器端口80上公开了一个非TLS HTTP端点,在443上公开了一个TLS HTTP端点。
我怀疑它不是,这将解释为什么当端口绑定到主机时(分别在32775和32774上)无法通过端口访问服务。
注意,您的客户端代码尝试访问
http://localhost:32774,这可能映射到容器的TLS端点(:443),因此您需要使用https://并配置证书。
如果在主机上运行Linux,可以尝试对这些端口进行telnet‘’ing,以查看是否得到响应:
telnet localhost 32775
telnet localhost 32774如果您有gRPCurl (对于任何gRPC开发您都应该使用gRPC),您可以尝试列出方法:
grpcurl \
-plaintext \
-proto path/to/your.proto \
localhost:32775 \
list
grpcurl \
-plaintext \
-proto path/to/your.proto \
localhost:32774 \
list注意:,我认为这是TLS和非TLS的正确
grpcurl,但是编写时不能测试
发布于 2021-10-04 15:43:03
添加以下代码
"Kestrel": {
"EndpointDefaults": {
"Protocols": "Http2"
}
}在appsettings.json服务器端的gRPC文件中,调用'http‘端口而不是在gRPC客户端调用'https’就可以了。在您的例子中,应该是:
using var channel = GrpcChannel.ForAddress("http://localhost:32775");https://stackoverflow.com/questions/65405148
复制相似问题