我的云中有多个使用 PHP 和 .NET Core 运行的应用程序。我现有的 ASP.NET Core Web API 在尝试连接我的 Cloud SQL (MySQL) 时没有问题。使用公共 IP 或私有 IP 与 VPC 进行访问都可以正常工作。但是,我在 Cloud Run 中使用 .NET Core 上的 Blazor Server 尝试了另一个应用程序,但无法连接到同一数据库服务器。
这是我的连接字符串
"DefaultConnection": "Server=/cloudsql/my-project-id:asia-southeast2:my-cloud-sql; User ID=userDb; Password=verysecret; Database=mydb_dev"
我尝试连接 VPC,创建一个 VPC 无服务器并将其附加到我的 Blazor 应用程序。
所以我的连接字符串变成这样:
"DefaultConnection": "Server=10.0.0.8; User ID=userDb; Password=verysecret; Database=mydb_dev"
它唯一起作用的时候是当我将 Cloud SQL 的授权网络更改为允许任何 IP 地址 (0.0.0.0/0) 时。我正在使用 Entity Framework Core 和包
Pomelo.EntityFrameworkCore.Mysql
,它可以与另一个 Cloud Run 上的 ASP.NET Core Web API 配合使用。
下面是我的 dockerfile,以防相关
# Stage 1: Build the Blazor Server app
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build-env
WORKDIR /app
# Copy csproj and restore dependencies
COPY *.csproj ./
RUN dotnet restore
# Copy all the source code and build the app
COPY . ./
RUN dotnet publish -c Release -o /out /p:UseAppHost=false
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
# Expose port 80
USER app
EXPOSE 8080
EXPOSE 8081
# Copy published files
COPY --from=build-env /out .
ENTRYPOINT ["dotnet", "MyBlazorApp.dll"]
我根据@Curtis 评论解决了这个问题。 这是个愚蠢的问题。
我的 Blazor 中有 EF Scaffold,它正在创建 OnConfiguring 方法,并且不是从 appsettings.json 获取连接字符串,而是像这样进行硬编码
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseMySql("server=10.0.0.1;user id=appUser;password=myPass;database=mydatabase", Microsoft.EntityFrameworkCore.ServerVersion.Parse("8.0.31-mysql"));
}
我删除了上面的行并将这些行添加到了program.cs
string connString = builder.Configuration.GetConnectionString("DefaultConnection") ?? string.Empty;
builder.Services.AddDbContext<MoccaDbContext>(options => {
options.UseMySql(connString, ServerVersion.AutoDetect(connString));
});
builder.Services.AddHttpContextAccessor();
现在工作正常,我可以使用私有和公共 IP 地址连接到 Cloud Run