部署到Azure - 无法连接到数据库

时间:2017-08-09 12:47:56

标签: c# mysql entity-framework azure azure-web-sites

我最近订阅了Azure免费试用版,我目前正在尝试发布我的网站。

然而,当我发布我的网站时,我遇到了以下错误:

[NullReferenceException: Object reference not set to an instance of an object.]
MySql.Data.MySqlClient.MySqlProviderServices.GetDbProviderManifestToken(DbConnection connection) +56
   System.Data.Entity.Core.Common.DbProviderServices.GetProviderManifestToken(DbConnection connection) +276
   System.Data.Entity.Utilities.DbProviderServicesExtensions.GetProviderManifestTokenChecked(DbProviderServices providerServices, DbConnection connection) +27
   System.Data.Entity.Infrastructure.<>c__DisplayClass1.<ResolveManifestToken>b__0(Tuple`3 k) +32
   System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory) +72
   System.Data.Entity.Infrastructure.DefaultManifestTokenResolver.ResolveManifestToken(DbConnection connection) +251
   System.Data.Entity.Utilities.DbConnectionExtensions.GetProviderInfo(DbConnection connection, DbProviderManifest& providerManifest) +56
   System.Data.Entity.DbModelBuilder.Build(DbConnection providerConnection) +43
   System.Data.Entity.Internal.LazyInternalContext.CreateModel(LazyInternalContext internalContext) +62
   System.Data.Entity.Internal.RetryLazy`2.GetValue(TInput input) +123
   System.Data.Entity.Internal.LazyInternalContext.InitializeContext() +610
   System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType) +18
   System.Data.Entity.Internal.Linq.InternalSet`1.Initialize() +53
   System.Data.Entity.Internal.Linq.InternalSet`1.get_InternalContext() +15
   System.Data.Entity.Infrastructure.DbQuery`1.System.Linq.IQueryable.get_Provider() +38

当我使用连接字符串本地运行到我的远程数据库时,它工作正常,但是一旦我发布它就不起作用。

我的连接字符串如下所示:

<add name="DefaultConnection" connectionString="user id=****;password=****;persistsecurityinfo=False;server=**** ;database=iprospect_tools" providerName="MySql.Data.MySqlClient" />
<add name="ToolsEntities" connectionString="metadata=res://*/ToolsModel.csdl|res://*/ToolsModel.ssdl|res://*/ToolsModel.msl;provider=MySql.Data.MySqlClient;provider connection string=&quot;user id=****;password=****;persistsecurityinfo=False;server=****;database=tools&quot;" providerName="System.Data.EntityClient" />

当我远程调试我的应用程序时,这是错误评估:

enter image description here

知道可能导致此错误的原因是什么?

2 个答案:

答案 0 :(得分:6)

您的问题中缺少一些信息,这会使提供答案的答案更容易,但这就是我要做的事情:

  1. 找出托管数据库的位置
  2. 这里要做的第一件事是找出你用于MySQL数据库的服务。在Azure中,至少有四种方法来托管MySQL数据库,每种方法可能需要不同的步骤。

    • 应用程序中的MySQL 由于您是从桌面进行远程连接,因此我不认为您使用此选项。

    • 由ClearDB提供的MySQL     如果你使用它,那么服务器名称将是这样的:us-cdbr-azure - * .cloudapp.net

    • MySQL提供的     如果您使用此服务器名称,则服务器名称将类似于:* .mysql.database.azure.com

    • 在IaaS VM中托管的MySQL     如果您使用此服务器名称,则服务器名称将类似于:* .cloudapp.net

    如果数据库未托管在Azure中,则应检查网络配置。

    1. 创建一个最简单的应用程序来测试连接性。
    2. 假设您的数据库托管在Azure中,下一步是减少您的依赖关系,以确定问题是否存在于Db服务器,网络配置,您的代码或其他依赖项。

       string myConnectionString = "your-connectionstring-goes-here";
          try{
              using (var con = new MySqlConnection { ConnectionString = myConnectionString }){
                  con.Open();
      
                  if (!con.Ping()){
                      System.Diagnostics.Trace.TraceError("MySQL Ping Failed:");
                  }
                  else{
                      System.Diagnostics.Trace.TraceInformation("MySQL Successfull");
                  }
              }
          }
          catch (Exception exep){
              System.Diagnostics.Trace.TraceError("Could not connect to MySQL: " + exep.Message);
          }
      

      注意在这个例子中,我们将连接字符串硬编码到代码中以绕过web-config。

      如果这样做,那么我们知道与数据库的连接是好的,应用程序服务应用程序可以到达数据库。跳过步骤(3)并转到步骤(4)

      如果它不能正常工作,那么我们还需要做更多的调试。转到步骤(3)

      1. 修复数据库服务器上的网络/防火墙

        • 如果您的数据库由Microsoft MySQL托管,请检查以确保防火墙允许您的应用连接到它并重复步骤(2)

        • 如果您的数据库托管在IaaS虚拟机中,请确保端口和网络处于开放状态以接受连接并重复步骤(2)

      2. 一旦你完成步骤(2),然后再次尝试使用你的代码。

        1. 调试代码
        2. 一旦您完成步骤(2),然后排除连接问题。这意味着该错误存在于您的代码,连接字符串配置或您使用实体框架的方式中。

          希望这有帮助

答案 1 :(得分:1)

如果网站在本地工作,并且在发布到Azure后数据库连接失败 - Azure网站设置中确实缺少配置。

enter image description here

查看这些SO thread 1SO thread 2