我创建了默认的 blazor 服务器端应用程序。然后添加Microsoft.AspNetCore.SignalR.Client
和 ChatHub
类(class)。然后编辑 startup.cs 文件(添加 services.AddSignalR()
和 endpoints.MapHub<ChatHub>("/chatHub")
)和 index.razor
页。然后由 IIS express 运行。没关系。
然后添加了 docker 支持并运行 Docker 主机。它不工作。因为只有集线器连接的 StartAsync 方法不起作用。如何运行它?帮我?
非常感谢你们。
错误是:
An unhandled exception occurred while processing the request. SocketException: Cannot assign requested address System.Net.Http.ConnectHelper.ConnectAsync(string host, int port, CancellationToken cancellationToken)
HttpRequestException: Cannot assign requested address System.Net.Http.ConnectHelper.ConnectAsync(string host, int port, CancellationToken cancellationToken)
index.razor 代码:
@code {
private HubConnection _hubConnection;
protected override async Task OnInitializedAsync()
{
_hubConnection = new HubConnectionBuilder()
.WithUrl(NavigationManager.ToAbsoluteUri("/chatHub"))
.Build();
_hubConnection.On<string, string>("ReceiveMessage", (user, message) =>
{
var encodedMsg = $"{user}: {message}";
StateHasChanged();
});
await _hubConnection.StartAsync(); // **DON'T WORK IN DOCKER HOST.**
}
}
docker 文件:
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
WORKDIR /app
EXPOSE 80
FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /src
COPY ["BlazorApp1/BlazorApp1.csproj", "BlazorApp1/"]
RUN dotnet restore "BlazorApp1/BlazorApp1.csproj"
COPY . .
WORKDIR "/src/BlazorApp1"
RUN dotnet build "BlazorApp1.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "BlazorApp1.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "BlazorApp1.dll"]
最佳答案
我最好的猜测是您的集线器客户端正在尝试连接到“the-public-url-out-of-docker/chatHub”:
_hubConnection = new HubConnectionBuilder() .WithUrl(NavigationManager.ToAbsoluteUri("/chatHub")) .Build();
NavigationManager.ToAbsoluteUri(...)
将转换 /chatHub
到向最终用户公开的公共(public) url。例如,如果您使用反向代理,它可能是域名。请注意,网址分为三个不同的级别:
+----------------------------------+
| HOST (5000) |
| + |
| |Port Mapping---------------+ |
| >-->-->|Container (80) | |
| | | |
| +--------------------+ |
+-----^----------------------------+
| reverse proxy
+-------+----------------------------+
| nginx |
| https://www.myexample.com/chatHub
| |
+-------^----------------------------+
|
|
|
|
+-------+-----------+
| |
| Browser | (Brazor sees only the public url via NavgiationManager )
| |
+-------------------+
但是,在 docker 中运行时,主机的网络始终无法从容器的网络中访问。
如果是这种情况,有几种方法应该可行:
.WithUrl(NavigationManager.ToAbsoluteUri("/chatHub"))
.将其硬编码到容器 ip&port。例如,如果你的容器在 80 上监听,它应该是 http://localhost/chatHub
. --network
用于运行 docker 时。更多详情,请参阅 this thread 关于docker - 如何在 Docker 镜像中运行 Signalr Blazor 客户端的 StartAsync 连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60408442/