我有一个.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.)
现在,在你指出其他许多问题之前,让我提前告诉你:
netsh Winsock reset
,然后重新启动了我的电脑。这是我的连接字符串,完全来自配置文件(敏感信息替换为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>
请记住,在另一个项目中也使用了相同的连接字符串,它没有任何问题。
我没有想法。什么可能是错的?
答案 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);
}
}