viv*_*una 3 c# sendgrid docker .net-core .net-5
我正在使用 SendGrid 发送电子邮件 .net5 windows 服务,当我从 Visual Studio 本地运行应用程序时,它按预期工作。SendEmailAsync但当我在 Docker 中运行应用程序时,它给出了一个例外。
例外:
由于证书链中的错误,远程证书无效:UntrustedRoot
List<Personalization> personalizations = new List<Personalization>();
Personalization personalization = new Personalization();
personalization.From = new EmailAddress(emailDetails.SenderMailID);
personalization.Tos = GetRecipientsList(emailDetails.RecipientMailID);
personalization.Subject = emailDetails.Subject;
personalizations.Add(personalization);
var msg = new SendGridMessage
{
From = new EmailAddress(emailDetails.SenderMailID),
Subject = emailDetails.Subject
};
msg.AddContent(MimeType.Html, emailDetails.Message);
msg.Personalizations = personalizations;
var sendGridClient = new SendGridClient(apiKey);
var sendGridResponse = await sendGridClient.SendEmailAsync(msg);
Run Code Online (Sandbox Code Playgroud)
Docker 文件:
#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.
FROM mcr.microsoft.com/dotnet/runtime:5.0 AS base
WORKDIR /app
FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
WORKDIR /src
COPY ["src/service/MyWindowsService/MyWindowsService.csproj", "src/service/MyWindowsService/"]
RUN dotnet restore "src/service/MyWindowsService/MyWindowsService.csproj"
COPY . .
WORKDIR "/src/src/service/MyWindowsService"
RUN dotnet build "MyWindowsService.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "MyWindowsService.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "MyWindowsService.dll"]
Run Code Online (Sandbox Code Playgroud)
看来这里的问题是不受信任的证书。例如,当证书是自签名的或使用非公共 CA 根时,可能会发生这种情况。
在这种情况下,您可以将证书或 CA 复制到基本/最终 docker 阶段的指定路径“/etc/ssl/certs/”。
例如,在 docker 文件的第二行中:
复制 ./server-certificate.pem /etc/ssl/certs/server-certificate.pem
前面的方法将告诉您这是否是您的问题。假设这是解决方案,我建议您不要直接将证书复制到 docker 文件中。例如,在生产环境中,如果您使用 Kubernetes 或 docker-compose 卷,则应将其作为 Secret 执行。
编辑:要获取证书,您需要信任并将其放在与 Dockerfile 相同的路径上。然后编辑你的 dockerfile,如下所示:
FROM mcr.microsoft.com/dotnet/runtime:5.0 AS base
COPY ./server-certificate.pem /etc/ssl/certs/server-certificate.pem
WORKDIR /app
FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
WORKDIR /src
COPY ["src/service/MyWindowsService/MyWindowsService.csproj", "src/service/MyWindowsService/"]
RUN dotnet restore "src/service/MyWindowsService/MyWindowsService.csproj"
COPY . .
WORKDIR "/src/src/service/MyWindowsService"
RUN dotnet build "MyWindowsService.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "MyWindowsService.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "MyWindowsService.dll"]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16307 次 |
| 最近记录: |