创建表后 Web 应用程序首次尝试插入 SQL 服务器数据库时 Azure 出错
Error in Azure when a Web App tries to insert into a SQL Server database for the first time after tables created
这是一个涉及 Azure 与 SQL 服务器和 Web 应用程序的问题。
本地一切正常。该问题仅存在于 Azure。
我已经设置了一个带有数据库的 SQL 服务器,并发布了一个网络应用程序。他们使用相同的区域。
一切都有默认设置,除了允许我的本地 ip 连接到数据库服务器。
我可以从 SQL Server Management Studio 连接到 Azure SQL 服务器,我可以在那里看到我的数据库。
我在网络应用程序中做的第一件事是尝试注册一个新用户。涉及的技术是 ASP.NET MVC5、ASP.NET Identity 和带有迁移脚本的 Entity Framework。正常的 MS 东西。
我在Publish/Settings/Databases对话框中设置了ApplicationDbContext(DefaultConnection)
并勾选了"Execute Code First Migrations"。
迁移脚本 运行 没问题。所有 table 都已创建并显示在 SQL Server Management Studio 中。
但是当 Web 应用程序尝试将新用户添加到 User
table 时,我收到如下所示的错误。
所以.. Web 应用程序显然具有对数据库的连接和访问权限,因为所有 tables 都已创建。知道我错过了什么吗?
感谢您的帮助和意见!
更新:
在web.config中我发现了一个新的ConnectionString:
DefaultConnection_DatabasePublish
配置正确。
原来的 DefaultConnection
在发布后 被 更改为 Data Source=localhost;Initial Catalog={catalog};Integrated Security=True
。
将 DefaultConnection 更改为与 DefaultConnection_DatabasePublish 相同 解决了问题。
我之前发布的时候没有出现过这种行为。我之前没有检查过"Execute Code First Migrations"。有人可以确认该行为是否与此相关吗?
Server Error in '/' Application.
The system cannot find the file specified
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.ComponentModel.Win32Exception: The system cannot find the file specified
Source Error:
An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.
Stack Trace:
[Win32Exception (0x80004005): The system cannot find the file specified]
[SqlException (0x80131904): A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server)]
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) +821
System.Data.SqlClient.SqlConnectionFactory.CreateConnection (DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions) +332
System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection (DbConnectionPool pool, DbConnection owningObject, DbConnectionOptions options, DbConnectionPoolKey poolKey, DbConnectionOptions userOptions) +38
System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection) +699
System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection) +89
System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection) +426
System.Data.ProviderBase.DbConnectionPool.WaitForPendingOpen() +343
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +99
System.Runtime.CompilerServices.TaskAwaiter. HandleNonSuccessAndDebuggerNotification(Task task) +58
System.Data.Entity.SqlServer.<b__3>d__6.MoveNext() +226
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +99
System.Runtime.CompilerServices.TaskAwaiter. HandleNonSuccessAndDebuggerNotification(Task task) +58
System.Data.Entity.SqlServer.d__9`1.MoveNext() +354
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +99
System.Runtime.CompilerServices.TaskAwaiter. HandleNonSuccessAndDebuggerNotification(Task task) +58
System.Data.Entity.Core.EntityClient.d__8.MoveNext() +594
根据你的描述和错误信息,我猜你没有在web.config中设置正确的连接字符串。
因此网络应用程序无法访问正确的 sql 数据库。
我建议您可以尝试使用 kudu 控制台来检查网络应用程序是否设置了正确的连接字符串。
1.Open kudu 控制台。
2.Use 调试控制台
3.Locate site\wwwroot 文件夹并找到 web.config 文件。
点击修改按钮。
4.Then 你可以找到连接字符串。
用旧的替换正确的连接字符串。
连接字符串格式如下:
Server=tcp:{sqlservername}.database.windows.net,1433;Initial Catalog={databasename};Persist Security Info=False;User ID={your_username};Password={your_password};MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;
或者您可以直接在 azure web 应用程序的应用程序设置中设置连接字符串。
这是一个涉及 Azure 与 SQL 服务器和 Web 应用程序的问题。
本地一切正常。该问题仅存在于 Azure。
我已经设置了一个带有数据库的 SQL 服务器,并发布了一个网络应用程序。他们使用相同的区域。
一切都有默认设置,除了允许我的本地 ip 连接到数据库服务器。
我可以从 SQL Server Management Studio 连接到 Azure SQL 服务器,我可以在那里看到我的数据库。
我在网络应用程序中做的第一件事是尝试注册一个新用户。涉及的技术是 ASP.NET MVC5、ASP.NET Identity 和带有迁移脚本的 Entity Framework。正常的 MS 东西。
我在Publish/Settings/Databases对话框中设置了ApplicationDbContext(DefaultConnection)
并勾选了"Execute Code First Migrations"。
迁移脚本 运行 没问题。所有 table 都已创建并显示在 SQL Server Management Studio 中。
但是当 Web 应用程序尝试将新用户添加到 User
table 时,我收到如下所示的错误。
所以.. Web 应用程序显然具有对数据库的连接和访问权限,因为所有 tables 都已创建。知道我错过了什么吗?
感谢您的帮助和意见!
更新:
在web.config中我发现了一个新的ConnectionString:
DefaultConnection_DatabasePublish
配置正确。
原来的 DefaultConnection
在发布后 被 更改为 Data Source=localhost;Initial Catalog={catalog};Integrated Security=True
。
将 DefaultConnection 更改为与 DefaultConnection_DatabasePublish 相同 解决了问题。
我之前发布的时候没有出现过这种行为。我之前没有检查过"Execute Code First Migrations"。有人可以确认该行为是否与此相关吗?
Server Error in '/' Application.
The system cannot find the file specified
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.ComponentModel.Win32Exception: The system cannot find the file specified
Source Error:
An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.
Stack Trace:
[Win32Exception (0x80004005): The system cannot find the file specified]
[SqlException (0x80131904): A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server)]
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) +821
System.Data.SqlClient.SqlConnectionFactory.CreateConnection (DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions) +332
System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection (DbConnectionPool pool, DbConnection owningObject, DbConnectionOptions options, DbConnectionPoolKey poolKey, DbConnectionOptions userOptions) +38
System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection) +699
System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection) +89
System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection) +426
System.Data.ProviderBase.DbConnectionPool.WaitForPendingOpen() +343
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +99
System.Runtime.CompilerServices.TaskAwaiter. HandleNonSuccessAndDebuggerNotification(Task task) +58
System.Data.Entity.SqlServer.<b__3>d__6.MoveNext() +226
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +99
System.Runtime.CompilerServices.TaskAwaiter. HandleNonSuccessAndDebuggerNotification(Task task) +58
System.Data.Entity.SqlServer.d__9`1.MoveNext() +354
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +99
System.Runtime.CompilerServices.TaskAwaiter. HandleNonSuccessAndDebuggerNotification(Task task) +58
System.Data.Entity.Core.EntityClient.d__8.MoveNext() +594
根据你的描述和错误信息,我猜你没有在web.config中设置正确的连接字符串。
因此网络应用程序无法访问正确的 sql 数据库。
我建议您可以尝试使用 kudu 控制台来检查网络应用程序是否设置了正确的连接字符串。
1.Open kudu 控制台。
2.Use 调试控制台
3.Locate site\wwwroot 文件夹并找到 web.config 文件。
点击修改按钮。
4.Then 你可以找到连接字符串。
用旧的替换正确的连接字符串。
连接字符串格式如下:
Server=tcp:{sqlservername}.database.windows.net,1433;Initial Catalog={databasename};Persist Security Info=False;User ID={your_username};Password={your_password};MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;
或者您可以直接在 azure web 应用程序的应用程序设置中设置连接字符串。