使用Docker和Asp.net内核的Heroku上的应用程序错误



我正在使用Docker和github操作在Heroku上托管一个asp.net核心api。

当操作运行时,一切都很好,应用程序就部署好了。转到url后,我会收到一条应用程序错误消息。这是我的日志中关注的部分

2022-02-17T16:41:54.949789+00:00 app[web.1]: [16:41:54 DBG] Failed to bind to http://[::]:80 (IPv6Any). Attempting to bind to http://0.0.0.0:80 instead.
2022-02-17T16:41:54.966069+00:00 app[web.1]: Unhandled exception. System.Net.Sockets.SocketException (13): Permission denied

经过一些搜索,我找到了这篇文章,这个之前的问题,还有这个在Program.cs文件中设置端口或在Dockerfile中设置ASPNETCORE_URLS=http://*:$PORT的问题。我两种都试过了,但都没用。这是我的Dockerfile

FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["PeerNotation.Api.csproj", "."]
RUN dotnet restore "PeerNotation.Api.csproj"
COPY . .
WORKDIR "/src"
RUN dotnet build "PeerNotation.Api.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "PeerNotation.Api.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "PeerNotation.Api.dll"]

和我的Program.cs文件中的代码片段

var port = Environment.GetEnvironmentVariable("PORT");
builder.WebHost.UseUrls($"http://*:{port}");

(我已经尝试记录端口,它从不为空(

我也遇到了同样的问题。如前所述,aspnetcore6.0kestrel服务器不工作。NET 6不再使用UseUrls((。

根据上面提到的链接中的指南,我将此片段添加到我的程序.cs:中

var portExists = int.TryParse(Environment.GetEnvironmentVariable("PORT"), out var port);
if (portExists)
{
builder.WebHost.ConfigureKestrel(options =>
{
options.ListenAnyIP(port);
});
}

部署应用程序开始工作后,Heroku中没有出现错误。

经过一些研究,我发现我使用了错误的方式设置端口。我应该将url添加到WebApplication对象中,如下所示:

if (app.Environment.IsProduction())
{
var port = Environment.GetEnvironmentVariable("PORT");
app.Urls.Add($"http://*:{port}");
}

现在,应用程序使用正确的端口。

最新更新