即使相同的连接字符串在本地网站上运行,也无法从Azure网站访问SQL Azure数据库

时间:2013-02-03 02:15:14

标签: sql-server azure asp.net-mvc-4

我最近在Azure上建立了我的第一个网站。目前,它基本上只是带有Home和Account控制器的标准MVC4模板网站。在Azure中,我有一个网站和一个SQL数据库。我可以从SSMS访问SQL Azure数据库,并设置了一个登录和用户,供我的网站使用。

在我的开发环境中,指向我的开发数据库,​​我可以正常访问/ Account / Login页面。我可以注册,我可以在我的本地数据库中看到新用户。我还可以更改连接字符串以将我的开发网站指向我的SQL Azure DB,然后我再次访问/帐户/登录并注册新用户。然后,我可以在SQL Azure DB中看到这些新用户。

将网站部署到Azure时会出现问题。我有一个与我的publishsettings文件关联的转换配置,我可以在输出窗口中看到,在将站点发布到Azure时,在部署期间应用了此转换。这会将本地开发数据库连接字符串修改为SQL Azure连接字符串。我还验证了这个SQL Azure连接字符串是在部署的实际web.config文件中(使用FileZilla FTP来检索部署的实际web.config)。我可以在[mysite] .AzureWebsites.net上访问我网站的主页,但是当我点击登录链接转到/帐户/登录页面时,我收到以下错误:

[ArgumentException: Format of the initialization string does not conform to specification starting at index 0.]
System.Data.Common.DbConnectionOptions.GetKeyValuePair(String connectionString, Int32 currentPosition, StringBuilder buffer, Boolean useOdbcRules, String& keyname, String& keyvalue) +5313265
System.Data.Common.DbConnectionOptions.ParseInternal(Hashtable parsetable, String connectionString, Boolean buildChain, Hashtable synonyms, Boolean firstKey) +124
System.Data.Common.DbConnectionOptions..ctor(String connectionString, Hashtable synonyms, Boolean useOdbcRules) +95
System.Data.SqlClient.SqlConnectionString..ctor(String connectionString) +59
System.Data.SqlClient.SqlConnectionFactory.CreateConnectionOptions(String connectionString, DbConnectionOptions previous) +24
System.Data.ProviderBase.DbConnectionFactory.GetConnectionPoolGroup(DbConnectionPoolKey key, DbConnectionPoolGroupOptions poolOptions, DbConnectionOptions& userConnectionOptions) +167
System.Data.SqlClient.SqlConnection.ConnectionString_Set(DbConnectionPoolKey key) +61
System.Data.SqlClient.SqlConnection.set_ConnectionString(String value) +66

System.Data.Entity.Internal.LazyInternalConnection.InitializeFromConnectionStringSetting(ConnectionStringSettings appConfigConnection) +122
System.Data.Entity.Internal.LazyInternalConnection.TryInitializeFromAppConfig(String name, AppConfig config) +32
System.Data.Entity.Internal.LazyInternalConnection.Initialize() +127
System.Data.Entity.Internal.LazyInternalConnection.get_ProviderName() +13
System.Data.Entity.Internal.LazyInternalContext.InitializeContext() +346
System.Data.Entity.Internal.InternalContext.CreateObjectContextForDdlOps() +17
System.Data.Entity.Database.Exists() +36
[MyWebsite].Filters.SimpleMembershipInitializer..ctor() +105

这似乎表明我的连接字符串存在问题,但正如我之前提到的,这个完全相同的连接字符串可以在我的本地网站上运行。

我认为问题可能与防火墙有关,但我检查了Azure管理门户中的设置,并应用了Windows Azure服务防火墙规则以允许该访问。此外,我尝试删除本地计算机的防火墙规则以访问SQL Azure数据库,看看我是否会收到类似的异常,但抛出的异常显然与防火墙有关。

我还尝试通过Azure管理门户添加SQL Azure连接字符串(虽然我没有看到如何指定提供程序) - 不用说,我得到了相同的“初始化格式......”上面提到的例外。

我在web.config中的连接字符串采用以下格式:

<add name="[my connection name]"
     connectionString="Server=tcp:abc123.database.windows.net,1433;Database=[my database];User ID=[my login]@abc123;Password=[my password];Trusted_Connection=False;Encrypt=True;Connection Timeout=30;" 
     providerName="System.Data.SqlClient" />

非常欢迎任何建议。

4 个答案:

答案 0 :(得分:7)

我最终得到了它的底部。我到目前为止没有意识到的是web.config中有2个连接字符串最终被部署到Windows Azure网站 - 我自己的自定义连接字符串,但另一个DefaultConnection连接字符串也是如此,其格式为:

<add name="DefaultConnection" connectionString="DefaultConnection_ConnectionString" providerName="System.Data.SqlClient" />
  • 显然,不是有效的连接字符串(因此上面的格式异常)。当您使用FTP从Azure网站下载实际的web.config时,可以看到这一点。

此默认连接字符串不在web.configs中的任何位置,也不在我的解决方案中的各种转换中。在发布期间查看“输出”窗口,有许多变换应用于web.config。我已经浏览了在构建/发布周期中生成的各种版本的文件,并且它们都没有DefaultConnection连接字符串,甚至在obj \ Release \ Package \ PackageTmp \文件夹中也没有。所以我猜测Web Deploy阶段正在插入它作为web.config的最后一次修改。在publishsettings文件中有一个MSDeployParameterValue元素,它提到了连接字符串和web.config - 我猜它可能就是这样。

在AccountModels.cs文件中,引用此DefaultConnection:

public UsersContext()
: base("DefaultConnection")
{
}

这是选择特定连接字符串的方式。 将此参数更改为自定义连接字符串名称可确保您的自定义数据库用于各种帐户内容,并解决上述格式异常。

答案 1 :(得分:2)

我知道这是一个老帖子,但我想分享我的发现。在我的.pubxml文件中,它存储了我的localdb连接字符串,并且不会在任何构建或发布上更新。我不得不用我的天蓝色数据库连接字符串手动更新发布文件,以使其工作。希望这有助于节省时间。

答案 2 :(得分:0)

关于SQL Azure的连接字符串

  • SQL Azure数据库服务仅适用于TCP端口1433.确保您的防火墙允许TCP端口1433上的传出TCP通信。

  • SQL Azure不支持Windows身份验证。可信连接将始终设置为False。

  • SQL Azure不支持未加密的连接。您需要在连接字符串中指定要加密连接。

  • 官方不支持使用OLE DB连接到SQL Azure。

标准方式

Server=tcp:[serverName].database.windows.net;Database=myDataBase;
User ID=[LoginForDb]@[serverName];Password=myPassword;Trusted_Connection=False;Encrypt=True;
  

使用'username @ servername'作为User ID参数。

有关详细信息,请查看Connection strings for SQL Azure

我希望这会对你有所帮助。

答案 3 :(得分:-1)

尝试删除“Encrypt = True;”或者尝试添加“TrustServerCertificate = True;” - 阅读SqlConnection.ConnectionString Property了解更多详情,但基本上是:

  

从.NET Framework 4.5开始,当TrustServerCertificate为false(默认)时   和Encrypt为true,即SQL Server中的服务器名称(或IP地址)   SSL证书必须与服务器名称(或IP地址)完全匹配   在连接字符串中指定。