同一台计算机上有两个Chrome会话 - 一个将连接到我们的Azure网站,另一个将无法连接到SQL Server数据库"

时间:2014-06-10 19:08:40

标签: asp.net-mvc-4 azure

我们遇到一个Azure网站的问题,该网站间歇性地因此错误而失败:

  

[SqlException(0x80131904):建立与SQL Server的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称是否正确,以及SQL Server是否配置为允许远程连接。 (提供程序:SQL网络接口,错误:26 - 查找指定的服务器/实例时出错)]

  

HttpException(0x80004005):无法连接到SQL Server数据库。

间歇性的意思是你可以开始一个新的浏览器会话,它会再次正常,然后在当天晚些时候它会失败。

网上有很多关于此错误的建议,但这一切都涉及正确设置您的连接字符串或修复webManager中的roleManager或成员身份。这些解决方案似乎都与我们网站上的间歇性错误兼容(即,如果我们的connectionstring或web.config不正确,可能是网站总是失败)。< / p>

我们有一个现有的网站foo.azurewebsites.net和代码库可能是相关的,我们切换到bar.azurewebsites.net并大幅更改了代码库(尽管从相同的原始文件开始)。我们还添加了一些简单的角色管理代码。是否有可能因为缓存新网站有时会尝试连接到旧网站的数据库(现在已经不见了)?

但我们有一个用户费力地帮助我们,从他的缓存中删除任何与“旧”网站相关的内容......这解决了他的问题......但第二天问题又回来了。

更新
最近我和2个并排的Chrome浏览器会话(不同的用户登录)坐在这里,一次又一次地访问该网站。一个会话出现100%错误,另一个会出现0%错误。但我现在无法重现它。对我来说没有任何错误。但是用户仍然说他们的错误率达到了80%到90%。

更新
它今天早上再次下降(对于一个浏览器会话),但是我尝试刷新很多次。一个不同的浏览器窗口/身份我和它一起发射是很好的。

更新
也许我有同样的问题here。正如Mark Heath所记录的那样,删除cookie似乎可以解决我的问题。目前正在尝试答案马克贴在那里,看看它是否也有助于我的情况。

1 个答案:

答案 0 :(得分:3)

假设您正在使用实体框架

警告:这仅适用于EF6 +。如果您使用的是EF5并遇到此问题,请考虑更新 - 这很容易。

如果Azure中存在间歇性数据库连接问题,则应实施重试策略。您可以通过SqlAzureExecutionStrategy完成此操作。这在此详细描述:http://msdn.microsoft.com/en-us/data/dn456835.aspx

以下是启用此功能的方法:

public class MyConfiguration : DbConfiguration 
{ 
    public MyConfiguration() 
    { 
        SetExecutionStrategy("System.Data.SqlClient", () => new SqlAzureExecutionStrategy()); 
    } 
}

然后你需要用配置属性装饰你的DbContext:

[DbConfigurationType(typeof(MyConfiguration))]
public class MyDbContext : DbContext 
{
// blah
}

如果您手动启动了交易,则需要禁用重试策略。为此,您需要将MyConfiguration更改为如下所示:

public class MyConfiguration : DbConfiguration 
{
    public MyConfiguration()
    {
        this.SetExecutionStrategy("System.Data.SqlClient", () => SuspendExecutionStrategy
              ? (IDbExecutionStrategy)new DefaultExecutionStrategy()
              : new SqlAzureExecutionStrategy(1, TimeSpan.FromSeconds(30))); 
    }

    public static bool SuspendExecutionStrategy
    {
        get
        {
            return (bool?)CallContext.LogicalGetData("SuspendExecutionStrategy") ?? false;
        }
        set
        {
            CallContext.LogicalSetData("SuspendExecutionStrategy", value);
        }
    } 
}

并像这样包装你的交易电话:

MyConfiguration.SuspendExecutionStrategy = true;
// start transaction
// do transaction stuff here
// commit/rollback transaction
MyConfiguration.SuspendExecutionStrategy = false;

从这里无耻地窃取代码:http://msdn.microsoft.com/sv-se/data/dn307226.aspx