azure - 连接/添加数据库时将 ASP.NET Core 应用程序部署到 Azure 失败

标签 azure entity-framework asp.net-core azure-sql-database web-deployment

我正在尝试使用 EF Core 和 Identity 将 ASP.NET Core 3.1 应用程序部署到使用 Azure SQL 数据库的 Azure。它构建成功,但部署失败,并出现以下错误:

Trackily -> C:\Users\szapt\source\repos\sprzeng\Trackily\Trackily\bin\Release\netcoreapp3.1\Trackily.dll
Trackily -> C:\Users\szapt\source\repos\sprzeng\Trackily\Trackily\bin\Release\netcoreapp3.1\Trackily.Views.dll
Trackily -> C:\Users\szapt\source\repos\sprzeng\Trackily\Trackily\obj\Release\netcoreapp3.1\PubTmp\Out\
Generating Entity framework SQL Scripts...
Executing command: dotnet ef migrations script --idempotent --output "C:\Users\szapt\source\repos\sprzeng\Trackily\Trackily\obj\Release\netcoreapp3.1\PubTmp\EFSQLScripts\Trackily.Areas.Identity.Data.TrackilyContext.sql" --context Trackily.Areas.Identity.Data.TrackilyContext 
Generating Entity framework SQL Scripts completed successfully
Adding sitemanifest (sitemanifest).
Adding database (data source=tcp:trackilydbserver.database.windows.net,1433;initial catalog=Trackily_db;user id=trackilydb@trackilydbserver)
C:\Program Files\dotnet\sdk\3.1.400\Sdks\Microsoft.NET.Sdk.Publish\targets\PublishTargets\Microsoft.NET.Sdk.Publish.MSDeploy.targets(140,5): Warning : Cannot connect to the database 'Trackily_db'.  
Retrying operation 'Add' on object dbFullSql (data source=tcp:trackilydbserver.database.windows.net,1433;initial catalog=Trackily_db;user id=trackilydb@trackilydbserver). Attempt 1 of 10.
C:\Program Files\dotnet\sdk\3.1.400\Sdks\Microsoft.NET.Sdk.Publish\targets\PublishTargets\Microsoft.NET.Sdk.Publish.MSDeploy.targets(140,5): Warning : The database 'Trackily_db' could not be created.  
Retrying operation 'Add' on object dbFullSql (data source=tcp:trackilydbserver.database.windows.net,1433;initial catalog=Trackily_db;user id=trackilydb@trackilydbserver). Attempt 2 of 10.
C:\Program Files\dotnet\sdk\3.1.400\Sdks\Microsoft.NET.Sdk.Publish\targets\PublishTargets\Microsoft.NET.Sdk.Publish.MSDeploy.targets(140,5): Warning : The database 'Trackily_db' could not be created.  
...(this continues for 10 attempts)...
C:\Program Files\dotnet\sdk\3.1.400\Sdks\Microsoft.NET.Sdk.Publish\targets\PublishTargets\Microsoft.NET.Sdk.Publish.MSDeploy.targets(140,5): Error : Web deployment task failed. ((2020-08-08 6:08:21 PM) An error occurred when the request was processed on the remote computer.)

(2020-08-08 6:08:21 PM) An error occurred when the request was processed on the remote computer.
The database 'Trackily_db' could not be created.
Login failed for user 'trackilydb'.
   at System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, SqlCredential credential, Object providerInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString userConnectionOptions, SessionData reconnectSessionData, DbConnectionPool pool, String accessToken, Boolean applyTransientFaultHandling, SqlAuthenticationProviderManager sqlAuthProviderManager)
   at System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions)
   at System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection, DbConnectionPoolGroup poolGroup, DbConnectionOptions userOptions)
   at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection)
   at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
   at System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
   at System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource`1 retry)
   at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)
   at System.Data.SqlClient.SqlConnection.Open()
   at Microsoft.Web.Deployment.SqlServerDatabaseProvider.AddHelper(DeploymentObject source)
Publish failed to deploy.

这是我第一次部署应用程序并使用 Azure,我按照以下网址的说明进行操作:

https://learn.microsoft.com/en-us/aspnet/core/tutorials/publish-to-azure-webapp-using-vs?view=aspnetcore-3.1#deploy-the-app-to-azure

这样做。

我目前认为将本地 EF Core 迁移应用到 Azure SQL 时可能存在问题。然而,有关此的信息一直让我感到困惑,似乎应该使用以下发布设置自动应用迁移:

Publish settings - 1

Publish settings - 2

到目前为止,我在开发应用程序时仅使用了本地 SQL 数据库(我相信是 SQL Server Express LocalDB)以及 EF Core 和 Identity。

appsettings.json

{
  "ConnectionStrings": {
    "TrackilyContextConnection": "Server=(localdb)\\mssqllocaldb;Database=Trackily;Trusted_Connection=True;MultipleActiveResultSets=true"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*"
}

Startup.cs

public class Startup
    {
        private readonly IWebHostEnvironment _env;

        public Startup(IConfiguration configuration, IWebHostEnvironment env)
        {
            Configuration = configuration;
            _env = env;
        }

        public IConfiguration Configuration { get; }

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext<TrackilyContext>(options =>
                options.UseSqlServer(
                    Configuration.GetConnectionString("TrackilyContextConnection")));

            services.AddDefaultIdentity<TrackilyUser>(options => options.SignIn.RequireConfirmedAccount = false)
                .AddEntityFrameworkStores<TrackilyContext>();

            if (_env.IsDevelopment())
            {
                services.Configure<IdentityOptions>(options =>
                {
                    options.Password.RequireDigit = false;
                    options.Password.RequireLowercase = false;
                    options.Password.RequireNonAlphanumeric = false;
                    options.Password.RequireUppercase = false;
                    options.Password.RequiredLength = 3;
                    options.Password.RequiredUniqueChars = 0;

                    options.Lockout.AllowedForNewUsers = false;
                });
            }
            else
            {
                services.Configure<IdentityOptions>(options =>
                {
                    options.Password.RequireNonAlphanumeric = false;
                    options.Password.RequireUppercase = false;
                    options.User.AllowedUserNameCharacters =
                        "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-.";
                    options.User.RequireUniqueEmail = true;
                });
            }

            services.AddScoped<TicketService>();
            services.AddScoped<UserTicketService>();
            services.AddScoped<CommentService>();
            services.AddScoped<ProjectService>();
            services.AddScoped<UserProjectService>();

            services.AddAuthorization(options =>
            {
                options.AddPolicy(
                    "TicketEditPrivileges",
                    policyBuilder => policyBuilder.AddRequirements(
                        new TicketEditPrivilegesRequirement()
                    ));
                options.AddPolicy(
                    "ProjectEditPrivileges",
                    policyBuilder => policyBuilder.AddRequirements(
                        new ProjectEditPrivilegesRequirement()));
                options.AddPolicy(
                    "ProjectDetailsPrivileges",
                    policyBuilder => policyBuilder.AddRequirements(
                        new ProjectDetailsPrivilegesRequirement()));
                options.AddPolicy(
                    "ProjectDeletePrivileges",
                    policyBuilder => policyBuilder.AddRequirements(
                        new ProjectDeletePrivilegesRequirement()));
            });

            services.AddScoped<IAuthorizationHandler, TicketEditPrivilegesUserIdHandler>();
            services.AddScoped<IAuthorizationHandler, ProjectEditPrivilegesProjectIdHandler>();
            services.AddScoped<IAuthorizationHandler, ProjectDetailsPrivilegesProjectIdHandler>();
            services.AddScoped<IAuthorizationHandler, ProjectDeletePrivilegesProjectIdHandler>();
        }

        public static void Configure(IApplicationBuilder app, IWebHostEnvironment env, UserManager<TrackilyUser> userManager)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
                app.UseDatabaseErrorPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
                app.UseHsts();
            }

            app.Use(async (context, next) =>
            {
                await next();
                if (context.Response.StatusCode == 404)
                {
                    context.Request.Path = "/Home/Error/404";
                    await next();
                }
            });

            app.UseHttpsRedirection();
            app.UseStaticFiles();

            app.UseRouting();

            app.UseAuthentication();
            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=Home}/{action=Index}/{id?}");
                endpoints.MapRazorPages();
            });

            DbSeeder.SeedUsers(userManager);
        }
    }

程序.cs

public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });
    }

我尝试更改 appsettings 中的连接字符串,以使用 Azure 门户上提供的连接字符串定位 Azure SQL 数据库,但这并没有修复部署问题。或者,我认为问题可能在于将应用程序连接到 Azure SQL 数据库,但我不确定为什么设置连接字符串无法解决此问题。

任何直接帮助或为我指明正确的方向将不胜感激。

最佳答案

我能够解决我的问题(尽管我尝试了很多方法,但我不确定哪一个具体解决了它)。

对于其他可能遇到类似问题的人,我会尝试以下步骤:

  1. 检查您是否使用在数据库的 Azure 页面上找到的连接字符串。您应该使用管理员用户名和密码,而不是数据库用户名和密码。

  2. 添加代码以对 Configure 中的数据库执行迁移方法Startup.cs 。例如,services.BuildServiceProvider().GetService<YourDbContextName>().Database.Migrate(); .

  3. 从 Visual Studio 的 SQL Server 对象资源管理器中连接到 Azure SQL 数据库。您可以按照此处的指南 https://medium.com/net-core/deploy-an-asp-net-core-app-with-ef-core-and-sql-server-to-azure-e11df41a4804这样做。

关于azure - 连接/添加数据库时将 ASP.NET Core 应用程序部署到 Azure 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63321774/

相关文章:

azure - 了解 WebJobs 如何运行

sql-server - LINQ(到 Oracle)- Row_Number() Over Partition By

c# - Asp.net core + EF Code优先,迁移不同项目中的文件

c# - 如何正确设置模型、POCO 类?

c# - 尚未注册类型 'Microsoft.AspNetCore.Hosting.IHostingEnvironment' 的服务

javascript - XMLHttpRequest 无法加载 No 'Access-Control-Allow-Origin' > 请求的资源上存在 header

Azure - 从 EA 门户获取订阅列表及其状态

azure - 在元数据文档中找不到 WsTrust 端点

python - Azure Function Python 模块兼容性问题

razor - 在多个 asp.net core 项目中使用单个布局页面