locked
Silverlight ビジネスアプリケーションでユーザの登録/認証ができません。エラーになってしまいます。 RRS feed

  • 質問

  • 新しいプロジェクトで「Silverlight ビジネスアプリケーション」を選択し、デフォルトのままビルドして、デバッグ続行をしたのですが、プロジェクトの「ログイン」から「今すぐ登録」をすると、「登録を送信しています....」の表示の後に、下記の場所で例外が発生してエラーになってしまいます。

    例外: HttpExceptionはユーザーコードによってハンドルされませんでした。(2行目)SQL Server データベースに接続できません。

    場所: UserRegistrationService.cs

            /// <summary>
            /// 指定された <see cref="RegistrationData"/> および <paramref name="password"/> を使用して新しいユーザーを追加します。
            /// </summary>
            /// <param name="user">このユーザーの登録情報です。</param>
            /// <param name="password">新しいユーザーのパスワードです。</param>
            [Invoke(HasSideEffects = true)]
            public CreateUserStatus CreateUser(RegistrationData user,
                [Required(ErrorMessageResourceName = "ValidationErrorRequiredField", ErrorMessageResourceType = typeof(ValidationErrorResources))]
                [RegularExpression("^.*[^a-zA-Z0-9].*$", ErrorMessageResourceName = "ValidationErrorBadPasswordStrength", ErrorMessageResourceType = typeof(ValidationErrorResources))]
                [StringLength(50, MinimumLength = 7, ErrorMessageResourceName = "ValidationErrorBadPasswordLength", ErrorMessageResourceType = typeof(ValidationErrorResources))]
                string password)
            {
                if (user == null)
                {
                    throw new ArgumentNullException("user");
                }

                // ロールが有効になり、既定のロールを使用できるように、ユーザーを作成する前にこれを実行します。
                //
                // ロール マネージャーに問題がある場合は、ユーザーを作成した後に失敗するよりも、この時点で失敗する方が適切です。
                if (!Roles.RoleExists(UserRegistrationService.DefaultRole))        <== ここで例外が発生!! ==
                {
                    Roles.CreateRole(UserRegistrationService.DefaultRole);
                }

                (略)

    }

    正しい動作だと、App_Data フォルダ下に aspnetdb.mdf というデータベースファイルが自動作成されるらしいのですが、作成されずにエラーとなってしまいます。同じエラーは英語版でも起きているようです。

    http://stackoverflow.com/questions/6152589/trouble-creating-sql-server-db-with-asp-net-membership-tables

    ちなみに、上記のURLの例と同じ、Chris Anderson氏の「Pro Business Applications with Silverlight 4」を読んでいます。

    自分なりに調べてみたのですが、下記の方法で回避できることは分かりました。

    http://blogs.wankuma.com/trapemiya/archive/2005/12/22/20161.aspx

    上記の方法で、ユーザは登録できましたので、データベースが動いていることは確かです。

    でもこのやり方だと、自分のプロジェクト内にデータベースを持つもので無いため、やっぱり腑に落ちません。

    どこが問題なのでしょうか? どなたか、よろしくお願いいたします m(__)m

     

    ちなみに開発環境はこちらです。

    Windows XP Professional Service Pack 3 / Intel Pentium 4 CPU 2.60GHz / メモリ 1GB

    Visual Studio 2010 Professional + Service Pack 1 (日本語)

    Microsoft SQL Server 2008 (Express だと思われる。DVD-ROMからVS2010をインストールしたときに、同時にインストール)

    Microsoft Silverlight Tools for Visual Studio 2010



    2011年7月5日 7:52

回答

  • もしやと思い、ASP.NET Webアプリケーションで、プロジェクトを新規作成し、ユーザ登録してみたところ、同じエラーが出たので、OSごとインストールし直したら、aspnetdb.mdfファイルが、App_Dataフォルダ配下に自動作成されるようになりました。

    今回は、SQL Serverのインストール時の、インスタンスのアカウント/パスワードを、Administratorではなく、Administrator権限を持った個人ユーザにしました。また、Visual Studio 2010のSilverlight開発環境を整えるのに、Silverlight 4 Toolsをインストールした後、Visual Studio 2010 Service Pack 1をインストールしたところ、「Silverlight Business Application」と英語表記されていたのが、「Silverlightビジネスアプリケーション」と日本語表記されるようになりました。

    不具合の原因はいまだ分かりませんが、OSの再インストールにより、うまく動くことは分かりました。


    2011年8月19日 2:12

すべての返信

  • Silverlight ビジネス アプリケーションを新規作成した状態だと、ローカル PC にある "SQLEXPRESS" という名前のデータベース インスタンスに接続しようとするようです。
    このインスタンスに正しく接続できるかどうかをチェックしてみてください。(そもそもサービスが起動してないということは、.....ないかな。)

    コマンド プロンプトを開いて、「sqlcmd -E -S .\SQLEXPRESS」と実行するとどうなるでしょうか?(「1>」 とコマンド入力待ちになれば成功です。「exit」として抜けてください。)
    あるいは、SQL Server Management Studio がインストール済みであれば、「.\SQLEXPRESS」 というサーバー名で接続してみてください。

    もしもインスタンス名が "SQLEXPRESS" でないならば、Web.config の connectionString の "data source" を適切な名前に書き換えてみてください。

    2011年7月7日 5:05
  • totojo様

    どうもご返事いただき、ありがとうございます。

    ご指摘いただいたように、「sqlcmd -E -S .\SQLEXPRESS」を実行してみましたが、「1>」と表示されたので、インスタンス名は間違っていないと思います。試しに別のインスタンス名にしてみましたが、その場合はエラーが出ました。SQL Server の方は、インストール時の設定のままですので、間違いは無いと思います。(但し、追加で SQL Server Management Studio をインストールしました。)

    下記に、Web.configファイルの一部を示します。

      <!--connectionStrings>
        <add name="ApplicationServices"
             connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnetdb.mdf;User Instance=true"
             providerName="System.Data.SqlClient" />
      </connectionStrings-->

      <connectionStrings>
        <add name="ApplicationServices" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=aspnetdb;Integrated Security=True"
             providerName="System.Data.SqlClient" />
      </connectionStrings>

    上が、最初の生成時のもの、下が書き換えたものです。構文が間違っているとか、そういうことはありますでしょうか?

    もしかして、Visual Studio 2005 Standard Edition を入れているから、競合が起こっているとか、そういう可能性はありませんでしょうか? 以前は SQL Server 2005 も入れていたのですが、アンインストールしました。

    2011年7月8日 4:42
  • connectionString の AttachDBFilename を認識できていないのでしょうかね。

    インストールされている SQL Server のバージョンとエディションを再度確認してみてください。

    SQL Server のバージョンとエディションを識別する方法
    http://support.microsoft.com/kb/321185/ja

    以前は SQL Server 2005 も入れていたのですが、アンインストールしました。

    この部分が少し気になります。
    2011年7月10日 3:29
  • SQL Server のバージョンとエディションを確かめました。

    製品バージョン: 10.0.2531.0

    製品レベル: SP1

    エディション: Express Edition

    SQL Server 2005 は、「コントロールパネル」の「プログラムの追加と削除」で削除しました。特にエラー等は出なかったと思います。

    2011年7月11日 2:56
  • なるほど、確かに SQL Server のバージョンとエディションには問題なさそうですね。

    ところで、AttachDBFilename に誰でも読み書きができる場所のファイルを指定しても、やっぱりダメでしょうか?
    Silverlight ビジネス アプリケーションを作成したばかりの状態だと、ユーザー プロファイルの配下にプロジェクトが作成されるのではないかと思います。
    2011年7月11日 9:01
  • 「Web.config」ファイルの「connectionStrings」を下記のように書き換えてみました。

      <connectionStrings>
        <add name="ApplicationServices"
             connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=c:\test\aspnetdb.mdf;User Instance=true"
             providerName="System.Data.SqlClient" />
      </connectionStrings>

    「c:\test」フォルダは、制限つきのユーザでも書き込めるフォルダです。

    これでもやはりエラー(最初の質問のときの例外)が出ました。

    もしかして、ログインユーザが「Administrator」だから駄目といったようなことはありますでしょうか?

    2011年7月14日 4:04
  • SQL Server のサービスがアクセスできるかどうかですので、基本的には Administrator だからダメということはないはずですけれども。
    (もし SQL Server サービスのログオン アカウントが Local System でなければ) Local System に変更&サービス再起動をしても、やはりダメでしょうか?

    Kris' blog - Failed to generate a user instance of SQL Server due to a failure in starting the process for the user instance. The connection will be closed.
    http://blog.krisvandermast.com/FailedToGenerateAUserInstanceOfSQLServerDueToAFailureInStartingTheProcessForTheUserInstanceTheConnectionWillBeClosed.aspx

    あとは、aspnetdb.mdf のゴミが残っているとか。うーん...。

    App_Dataフォルダにデータベースを作成できません
    http://social.msdn.microsoft.com/Forums/ja-JP/vwdexpressja/thread/13919e51-b9f9-4ab4-8ef7-92dce872851b
    2011年7月14日 6:30
  • こんにちは。

    Silverlight ビジネス アプリケーション プロジェクトテンプレートは、作成してすぐの状態ですと AspNetSqlProviderが構成されていないので正しく動かないようです。
    (使う側の環境に合わせてプロバイダー構成してねってことなのでしょう。)

    WebConfig初期構成のままで、 AspNetSqlProviderを構成するためには、下記手順が必要です。

    1.aspnet_regsql.exeツールを使用して、AspNetSqlProvider用のaspnetdbを作成する。
    (この手順は、もう実行されているようですね。)

    2.SSMSにて、上記1のaspnetdbをデタッチする。

    3.aspnetdb.mdfをWebプロジェクトのデータディレクトリ(App_Dataフォルダ)に移動する。

    4.SSMSにて、移動したaspnetdb.mdfにアタッチする。

    以上で、ユーザーが作成できるようになると思います。
    よろしくお願い致します。

    2011年7月14日 6:54
  • Silverlight ビジネス アプリケーション プロジェクトテンプレートは、作成してすぐの状態ですと AspNetSqlProviderが構成されていないので正しく動かないようです。
    (使う側の環境に合わせてプロバイダー構成してねってことなのでしょう。


    決してそのようなことはないのですが、確かに aspnetdb.mdf をあらかじめ作成しておいて、それを利用するというのも、余計なことに神経を使うよりは健全かもしれないですね。
    Silverlight ビジネス アプリケーションを新規作成してそのまま実行すると、aspnetdb.mdf を新規作成するところまで込みでやってくれるので、そうできれば美しいし、うれしいという趣旨のスレッドではあるのですが。
    2011年7月14日 7:06
  • 決してそのようなことはないのですが、確かに aspnetdb.mdf をあらかじめ作成しておいて、それを利用するというのも、余計なことに神経を使うよりは健全かもしれないですね。
    Silverlight ビジネス アプリケーションを新規作成してそのまま実行すると、aspnetdb.mdf を新規作成するところまで込みでやってくれるので、そうできれば美しいし、うれしいという趣旨のスレッドではあるのですが。
    えええっ
    そうなのですか!?

    うちのどの環境でも新規作成してくれたことが無かったので、自分で作るもんだと思っていましたが・・・。
    2011年7月14日 7:35
  • うちのどの環境でも新規作成してくれたことが無かったので、自分で作るもんだと思っていましたが・・・。

    手元の環境だと、「Silverlight ビジネス アプリケーション」以外でも、「ASP.NET Web アプリケーション」とか「ASP.NET MVC 3 Web アプリケーション」とかは、新規ユーザー作成時に aspnetdb.mdf を勝手に作ります。
    次の URL でも「自動的に作成されます。」とは書かれています。

    SQL Server Express の ASP.NET との使用
    http://msdn.microsoft.com/ja-jp/library/ms247257(v=VS.100).aspx
    (「SQL Server Express データベースの設定」の項目)
    2011年7月14日 7:47
  • 確かに書いてありますね!

    Expressあまり使っていなかったので気づかなかったです。すみません。

    しかし、なぜ作ってくれないんだろう・・・

    2011年7月14日 8:12
  • SQL Server サービスのログオン アカウントが「NT AUTHORITY\NETWORK SERVICE」だったので、「Local System」に変えてみましたが、駄目でした。あと、aspnetdb.mdfのゴミが残っている件も、該当フォルダを確認してみましたが、残っていませんでした。何が原因でしょう?

    Tetsuaki Uchidaさんも同じ現象になっているようなので、自分だけではないのかなと思いましたが、困ったもんですね。

    今度、自宅のPC(Windows7)で確かめてみます。

    2011年7月20日 5:37
  • 自宅のマシンにVisual Studio 2010 Professional (試用版)とSQL Server 2008 Express、Silverlight Tools をインストールして、ビジネスアプリケーションをビルドしてみましたが、今度はaspnetdb.mdfが自動作成されました。

    でも、なぜか、ビジネスアプリケーションのプロジェクトテンプレートだけが、英語になっています。

    なんか謎ですね。ただ、環境によってうまくaspnetdb.mdfが作成されることは分かりました。

    2011年7月24日 3:41
  • aspnetdb.mdfが自動作成されない理由は分かりませんでしたが、ただ、環境に依存するということは分かりましたので、Tetsuaki Uchidaさんのやり方(aspnet_regsql.exeでデータベースファイルを作成してApp_Dataフォルダ以下に置く)で対処することにいたします。本質的な解決ではありませんが、一応これをもって回答といたします。みなさん、どうもありがとうございました。

    • 回答としてマーク kawata_sotaro 2011年7月27日 1:22
    • 回答としてマークされていない kawata_sotaro 2011年8月19日 2:03
    2011年7月27日 1:22
  • もしやと思い、ASP.NET Webアプリケーションで、プロジェクトを新規作成し、ユーザ登録してみたところ、同じエラーが出たので、OSごとインストールし直したら、aspnetdb.mdfファイルが、App_Dataフォルダ配下に自動作成されるようになりました。

    今回は、SQL Serverのインストール時の、インスタンスのアカウント/パスワードを、Administratorではなく、Administrator権限を持った個人ユーザにしました。また、Visual Studio 2010のSilverlight開発環境を整えるのに、Silverlight 4 Toolsをインストールした後、Visual Studio 2010 Service Pack 1をインストールしたところ、「Silverlight Business Application」と英語表記されていたのが、「Silverlightビジネスアプリケーション」と日本語表記されるようになりました。

    不具合の原因はいまだ分かりませんが、OSの再インストールにより、うまく動くことは分かりました。


    2011年8月19日 2:12