Skip to content

Windows AzureでSimpleMembershipを使う

2012年10月18日

「ASP.NET MVC 4 Webロール」テンプレートを使ってページやWeb APIを作っています。

このテンプレートにはSimpleMembershipを使ったユーザー管理が予め盛り込まれており、それを利用することにしました。

そのままだとローカルDBにMembership関連のDBが作成されてしまうので、今回はWindows Azure SQL データベース を参照するよう[InitializeSimpleMembershipAttribute.vb]の[SimpleMembershipInitializer]クラスのコンストラクタに下記変更を施し、ローカルでのデバッグ実行で動作確認しました。

'web.configの接続文字列名「DefaultConnection」からではなくcscfgの設定「DBConnectionString」から取得するよう変更
WebSecurity.InitializeDatabaseConnection(RoleEnvironment.GetConfigurationSettingValue("DBConnectionString"), "System.Data.SqlClient", "UserProfile", "UserId", "UserName", autoCreateTables:=True)
'WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables:=True)

はい、ローカルでのデバッグ実行ではこれで正常に動作していたんです。Azure SQL データベースにユーザーやロールが作成されていたし。

そして、Windows Azureにデプロイして確認・・・、すると、例外が発生するではありませんか!

ログに吐き出されたスタックトレースを眺めていたところ、

An error occurred while getting provider information from the database. This can be caused by Entity Framework using an incorrect connection string. Check the inner exceptions for details and ensure that the connection string is correct.

エンティティフレームワークを使っているっぽいことと、

A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: SQL Network Interfaces, error: 52 – Unable to locate a LocalDB installation. Verify that SQL Server Express is properly installed and that the LocalDB feature is enabled.)

ローカルDBを見に行ってしまっているっぽいことが分かります。

そこでweb.configを確認すると、

<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
<parameters>
<parameter value="v11.0" />
</parameters>
</defaultConnectionFactory>
</entityFramework>

デフォルトでローカルDBを使うことになってますね。Azure SQL データベースを参照するようにしなければなりません。

web.configでLocalDbConnectionFactoryをSqlConnectionFactoryに変更してparameterに接続文字列を書いてもいいのでしょうけど、Azureの場合はweb.configは配置パッケージの中に含まれてしまうのでソースコードに接続文字列を書いているのと大差ありません。

なので、cscfgから接続文字列を設定すべく、次の1行を追加しました。

'Azureに配置するにあたって追加
Database.DefaultConnectionFactory = New SqlConnectionFactory(RoleEnvironment.GetConfigurationSettingValue("DBConnectionString"))

これでAzure上で正常に動作するようになりました!

最終的にいじった行は2行だけ、SimpleMembershipInitializerクラスのコンストラクタは次のようになりました。

Private Class SimpleMembershipInitializer
  Public Sub New()
'Azureに配置するに当たって追加
Database.DefaultConnectionFactory = New SqlConnectionFactory(RoleEnvironment.GetConfigurationSettingValue("DBConnectionString"))

    Database.SetInitializer(Of UsersContext)(Nothing)
    Try
      Using context As New UsersContext()
If Not context.Database.Exists() Then
' Create the SimpleMembership database without Entity Framework migration schema
          CType(context, IObjectContextAdapter).ObjectContext.CreateDatabase()
End If
End Using
      'web.configの接続文字列名「DefaultConnection」からではなくcscfgの設定「DBConnectionString」から取得するよう変更
WebSecurity.InitializeDatabaseConnection(RoleEnvironment.GetConfigurationSettingValue("DBConnectionString"), "System.Data.SqlClient", "UserProfile", "UserId", "UserName", autoCreateTables:=True)
'WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables:=True)

    Catch ex As Exception
      Throw New InvalidOperationException("The ASP.NET Simple Membership database could not be initialized. For more information, please see <a href="http://go.microsoft.com/fwlink/?LinkId=256588">http://go.microsoft.com/fwlink/?LinkId=256588</a>", ex)
End Try
End Sub
End Class
広告

From → .NET, Azure, SQL

コメントする

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。