2016-12-06 14 views
0

ローカルマシンから問題なくSQL Azureに接続する.NET Webアプリケーションがあります。同じマシン上で、別のコマンドライン.NETアプリケーションを同じソリューションで作成し、接続文字列をweb.configからapp.configにコピーしました。と同じアセンブリをWebサーバー(my connection/Entity Framework/model層がそれ自身のアセンブリ上にある)、データベースにアクセスしようとしました。私は次のエラーを取得しています:SQL Azure:SSLプロバイダ、エラー:0 - 待機操作がタイムアウトしました

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を再起動し、PCを何度も再起動しました。
  • 私はnetsh Winsock resetを正常に実行した後、私のPCを再起動しました。
  • 私のPCにはウイルス対策/マルウェア対策またはファイアウォールはありません。この意味でWindowsファイアウォールやWindows 10のコンポーネントに組み込まれているものは他にありませんでした。 (もちろん、パンダアンチウイルスは特にありません。いいえ、bloatwareも、元のWindows 10のインストールであり、OEMのものではありません)
  • 私はWindowsファイアウォールをオンとオフの両方で試してみましたが、 。
  • マシンがParallels上で仮想マシンとして実行されていれば意味があります。 Windowsには複数のネットワークアダプタが用意されていないので、私のWebアプリケーションとコンソールアプリケーションは同じ意味で同じ "インターネット接続"を使用しています。
  • 接続タイムアウトは30秒ですが、30秒後ではなくすぐにエラーが発生します。
  • 両方のプロジェクトは、Visual Studio 2015 Update 3でデバッグされた同じWindows 10マシンで実行され、.NET Framework 4.6に対してビルドされています。
  • 私は過去数週間で問題のあるプロジェクトに触れていないし、数週間前には完全に動作していました。
  • と思われるもの:私はフィドラーをインストールしていますが、これまで使用していた時期にはいつもインストールしていました。数週間後、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 [email protected];Password=XXXX;Trusted_Connection=False;Encrypt=True;Connection Timeout=30;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" /> 
</connectionStrings> 

非常に同じ接続文字列もの他のプロジェクトで使用されると、それはなしで動作していることを覚えておいてください問題。

私はアイデアがありません。何が間違っているのでしょうか?

+0

これは暗号化された接続なので、.Net側のSSLに問題がある可能性があります。あなたの '働いている'アプリで 'ServicePointManager'を探してみることができます - おそらくいくつかのハッキングがcertifcate/tlsのバージョンなどです – Lanorkin

答えて

1

Server=tcp:XXXX.database.windows.net,1433;Database=XXXX;User [email protected];Password=XXXX;Trusted_Connection=False;Encrypt=True;Connection Timeout=30;MultipleActiveResultSets=True;App=EntityFramework"

接続文字列は大丈夫です。そしてあなたの説明によると、コンソールアプリケーションとWebアプリケーションは同じソリューションにあり、同じローカル環境で実行されます。ファイアウォールルールによってアプリケーションがAzure SQLデータベースに接続できない場合、両方のアプリケーションが動作しません。問題を再現するのは難しいですが、私はテーブルを作成し、エンティティフレームワークのコードの最初のアプローチを介してAzure SQLデータベースにレコードを追加するコンソールアプリケーションを作成し、アプリケーションは私の側で正常に動作します。

Dbcontext

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

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

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
    } 

} 

Modelクラス

class Blog 
{ 
    public Blog(){} 

    public int BlogId { get; set; } 

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

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

Mainメソッド

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); 
    } 
} 
関連する問題