11

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

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

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

[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 DB 的防火墙规则,看看我是否会得到类似的异常,但抛出的异常显然与防火墙相关。

我还尝试通过 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

4 回答 4

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")
{
}

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

于 2013-02-05T21:32:46.380 回答
2

我知道这是一篇旧帖子,但我想分享我的发现。在我的 .pubxml 文件中,它存储了我的 localdb 连接字符串,并且不会在任何构建或发布时更新。我必须使用我的 azure DB 连接字符串手动更新发布文件才能使其正常工作。希望这有助于节省某人的时间。

于 2015-12-29T18:28:01.503 回答
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;

使用“用户名@服务器名”作为用户 ID 参数。

有关更多信息,请查看SQL Azure 的连接字符串

我希望这对你有帮助。

于 2013-02-03T17:08:30.183 回答
-1

尝试删除“Encrypt=True;” 或尝试添加“TrustServerCertificate=True;” - 阅读SqlConnection.ConnectionString 属性以获取更多详细信息,但基本上:

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

于 2013-02-03T16:38:27.933 回答