我们遇到一个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似乎可以解决我的问题。目前正在尝试答案马克贴在那里,看看它是否也有助于我的情况。
答案 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