我有一个asp.net应用程序部署到Azure网站连接到Azure SQL数据库。这在去年一直运行良好,但上周末我开始收到连接到数据库的错误,给出了以下堆栈跟踪。
[Win32Exception (0x80004005): Access is denied]
[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)]
此错误会持续几个小时然后消失几个小时。始终可以从我的机器访问数据库。
我尝试过的一些事情是:
这个错误开始出现可能会发生什么?该应用程序自8月以来未发生变化。
编辑: Azure支持发现实例上存在套接字和端口耗尽。造成这种情况的根本原因仍然是未知的。
答案 0 :(得分:2)
Craig是正确的,因为您需要实现SQLAzure Transient Fault Handling。您可以在此处找到相关说明:https://msdn.microsoft.com/en-us/library/hh680899(v=pandp.50).aspx
来自文章
您可以实例化PolicyRetry对象并包装您的呼叫 使用方法使用ExecuteAction方法创建SQL Azure 显示在前面的主题中。但是,该块也包括直接 支持通过ReliableSqlConnection使用SQL Azure 类。
以下代码段显示了如何打开可靠的示例 与SQL Azure的连接。
using Microsoft.Practices.EnterpriseLibrary.WindowsAzure.TransientFaultHandling;
using Microsoft.Practices.EnterpriseLibrary.WindowsAzure.TransientFaultHandling.AzureStorage;
using Microsoft.Practices.EnterpriseLibrary.WindowsAzure.TransientFaultHandling.SqlAzure;
...
// Get an instance of the RetryManager class.
var retryManager = EnterpriseLibraryContainer.Current.GetInstance<RetryManager>();
// Create a retry policy that uses a default retry strategy from the
// configuration.
var retryPolicy = retryManager.GetDefaultSqlConnectionRetryPolicy();
using (ReliableSqlConnection conn =
new ReliableSqlConnection(connString, retryPolicy))
{
// Attempt to open a connection using the retry policy specified
// when the constructor is invoked.
conn.Open();
// ... execute SQL queries against this connection ...
}
以下代码段显示了如何使用重试执行SQL命令的示例。
using Microsoft.Practices.EnterpriseLibrary.WindowsAzure.TransientFaultHandling;
using Microsoft.Practices.EnterpriseLibrary.WindowsAzure.TransientFaultHandling.AzureStorage;
using Microsoft.Practices.EnterpriseLibrary.WindowsAzure.TransientFaultHandling.SqlAzure;
using System.Data;
...
using (ReliableSqlConnection conn = new ReliableSqlConnection(connString, retryPolicy))
{
conn.Open();
IDbCommand selectCommand = conn.CreateCommand();
selectCommand.CommandText =
"UPDATE Application SET [DateUpdated] = getdate()";
// Execute the above query using a retry-aware ExecuteCommand method which
// will automatically retry if the query has failed (or connection was
// dropped).
int recordsAffected = conn.ExecuteCommand(selectCommand, retryPolicy);
}
答案 1 :(得分:1)
Azure支持的答案表明我遇到的连接问题是由于端口/插槽耗尽造成的。这可能是由同一主机方案中的另一个网站造成的。
通过更改托管服务级别来解决症状被删除的原因: