SQL Azure:SSL提供程序,错误:0 - 等待操作超时

时间:2016-12-06 16:16:37

标签: .net azure visual-studio-2015 azure-sql-database .net-4.6

我有一个.NET Web应用程序连接到SQL Azure,本地计算机没有任何问题。然后,在同一台机器上,我在同一个解决方案中创建了另一个命令行.NET应用程序,将连接字符串从web.config复制到app.config,引用了相同的与Web服务器的程序集(我的连接/实体框架/模型层在它自己的程序集上)并尝试访问我的数据库。我收到以下错误:

Exception thrown: 'System.Data.SqlClient.SqlException' in System.Data.dll

Additional information: A connection was successfully established with the server, 
but then an error occurred during the pre-login handshake. (provider: SSL Provider,
error: 0 - The wait operation timed out.)

现在,在你指出其他许多问题之前,让我提前告诉你:

  • 相同的 .NET版本的.NET应用程序相同的计算机/解决方案 能够访问该应用程序数据库使用完全相同的连接字符串并使用相同的程序集/包版​​本等,没有任何问题。
  • 我已清理/重建我的解决方案,重新启动Visual Studio并多次重启我的电脑。
  • 我已成功执行netsh Winsock reset,然后重新启动了我的电脑。
  • 我的电脑上没有防病毒/反恶意软件或防火墙。除了Windows防火墙和内置Windows 10组件之外,从未有过这种意义上的任何东西。 (是的,当然,特别是没有Panda Antivirus。不,没有英国媒体报道,它是原始的Windows 10安装,而不是OEM安装)
  • 我试过Windows防火墙打开和关闭,似乎没有影响。
  • 如果有任何意义,机器在Parallels上作为虚拟机运行。 Windows没有可用的多个网络适配器,因此我的Web应用程序和控制台应用程序都使用相同的" Internet连接"从那个意义上说。
  • 连接超时为30秒,但我立即收到错误,而不是30秒后。 (它表示它已成功连接)
  • 通过Visual Studio 2015 Update 3调试的同一台Windows 10计算机上的两个项目都是针对.NET Framework 4.6构建的。
  • 在过去的几周里,我甚至没有触及过这个有问题的项目,而且几周前它曾经完美地运作。
  • 任何可能可疑的东西:我已经安装了Fiddler,但我总是在它曾经工作的时候安装它。在几周内,AFAIR,我刚刚安装了Steam和Visual Studio 2017 RC,但它们还没有打开。
  • 我在Azure方面没有收到任何可疑错误等。
  • 我可以使用SQL Server Management Studio以相同的凭据访问服务器,并且可以毫无问题地查询数据库。 (我在SSMS打开,关闭和/或重启后打开/关闭时都遇到了同样的问题。)
  • 我已经看到了无数关于同一问题的问题,但他们几乎都指向防病毒/防火墙并重置了winsock并且我已经完成了。

这是我的连接字符串,完全来自配置文件(敏感信息替换为XXXX):

<connectionStrings>
    <add name="Data" connectionString="Server=tcp:XXXX.database.windows.net,1433;Database=XXXX;User ID=XXXX@XXXX.database.windows.net;Password=XXXX;Trusted_Connection=False;Encrypt=True;Connection Timeout=30;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />
</connectionStrings>

请记住,在另一个项目中也使用了相同的连接字符串,它没有任何问题。

我没有想法。什么可能是错的?

1 个答案:

答案 0 :(得分:1)

  

Server = tcp:XXXX.database.windows.net,1433; Database = XXXX; User ID =XXXX@XXXX.database.windows.net; Password = XXXX; Trusted_Connection = False; Encrypt = True; Connection Timeout = 30 ; MultipleActiveResultSets = TRUE;应用=的EntityFramework&#34;

连接字符串似乎没问题。根据您的描述,控制台应用程序和Web应用程序在相同的解决方案中并在相同的本地环境中运行,如果防火墙规则阻止应用程序连接到Azure SQL数据库,则两个应用程序都不起作用。很难重现这个问题,我创建了一个控制台应用程序来创建表并通过Entity Framework Code First方法向Azure SQL数据库添加记录,该应用程序在我这方面运行良好。

<强>的DbContext

class BloggingContext: DbContext
{
    public BloggingContext()
        : base("name=Data")
    {
    }

    public virtual DbSet<Blog> Blogs { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
    }

}

模型类

class Blog
{
    public Blog(){}

    public int BlogId { get; set; }

    [StringLength(200)]
    public string Name { get; set; }

    [StringLength(200)]
    public string Url { get; set; }
}

主要方法

class Program
{
    static void Main(string[] args)
    {

        using (var db = new BloggingContext())
        {
            Console.Write("Enter a name for a new Blog: ");
            var name = Console.ReadLine();

            var blog = new Blog { Name = name };
            db.Blogs.Add(blog);
            db.SaveChanges();

            var query = from b in db.Blogs
                        orderby b.Name
                        select b;

            Console.WriteLine("All blogs in the database:");
            foreach (var item in query)
            {
                Console.WriteLine(item.Name);
            }

            Console.WriteLine("Press any key to exit...");
            Console.ReadKey();
        }

    }
}

您可以使用我的示例代码创建一个新的控制台应用程序,以测试它是否有效。或者您可以在另一台计算机上运行您的应用程序,以确保是否会出现相同的问题。

此外,请确保您是否可以使用控制台应用程序中的以下代码打开数据库连接。

static void Main(string[] args)
{
    using (var connection = new SqlConnection(
        "Server=tcp: XXXX.database.windows.net,1433;Database= XXXX;User ID= XXXX;Password= XXXX;Trusted_Connection=False;Encrypt=True;Connection Timeout=30;MultipleActiveResultSets=True;App=EntityFramework"
        ))
    {
        connection.Open();
        Console.WriteLine("Connected successfully.");

        Console.WriteLine("Press any key to finish...");
        Console.ReadKey(true);
    }
}