Azure网站有时无法访问Azure SQL数据库

时间:2015-11-22 17:01:14

标签: asp.net sockets azure azure-sql-database azure-web-sites

我有一个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)]

此错误会持续几个小时然后消失几个小时。始终可以从我的机器访问数据库。

我尝试过的一些事情是:

  • 添加“允许所有”防火墙规则(0.0.0.0-255.255.255.255)无效
  • 更改连接字符串以使用数据库所有者作为凭据无效。
  • 具有效果的是将天蓝色托管级别更改为其他内容。这可以暂时解决问题,并且网站可以再访问数据库几个小时。

这个错误开始出现可能会发生什么?该应用程序自8月以来未发生变化。

编辑: Azure支持发现实例上存在套接字和端口耗尽。造成这种情况的根本原因仍然是未知的。

2 个答案:

答案 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支持的答案表明我遇到的连接问题是由于端口/插槽耗尽造成的。这可能是由同一主机方案中的另一个网站造成的。

通过更改托管服务级别来解决症状被删除的原因:

  • 更改主机方案有一段时间了,因为它移动了虚拟机并关闭了所有套接字。
  • 将主机方案从B级更改为S级,因为azure限制了B级的套接字数量。