ここでは、
.NET ジェネレーターの使用に関わる一般的なエラーと、それを迅速に解決する方法を示します。
SQL LocalDB は Windows ARM 上で動作するため、SQL LocalDB を使用して
ナレッジベースを作成できます。
IIS でホストされている、生成された .NET アプリケーションにパブリックインスタンスの MSSQLLocalDB を使用しようとすると、次のような内容のエラーが表示される場合があります:
DBMS エラーコード:-1983577832。SQL Server への接続を確立しているときにネットワーク関連またはインスタンス固有のエラーが発生しました。サーバーが見つからないかアクセスできませんでした。インスタンス名が正しいこと、および SQL Server がリモート接続を許可するように構成されていることを確認してください。(プロバイダー: SQL ネットワークインターフェース、エラー: 50 - Local Database Runtime エラーが発生しました。自動インスタンスを作成できません。エラーの詳細については、Windows アプリケーションのイベントログを参照してください。
このエラーは、実行時に Windows ID ユーザーを使用してデータベースを作成する場合に発生します。Web アプリケーションは IIS ユーザーでデータベースに接続します (データストアで
[ Use trusted connection ] プロパティ =True のため)。このユーザーはインスタンスが
共有インスタンスではない限りデータベースへのアクセス権がなく、MSSQLLocalDB はこの条件を満たしません。
このエラーは Web サーバーが Kestrel の場合には発生しません。この場合、プロセスは同じユーザーがログインした状態で既定で実行されます。
共有インスタンスは、次のコマンドで作成できます:
SqlLocalDB.exe create LocalTestInstance
SqlLocalDB.exe share "LocalTestInstance" "LocalSharedInstance"
その後、データストアのプロパティを設定します:
Server Name = (localdb)\.\LocalSharedInstance
// 共有インスタンスには \.\ (バックスラッシュ + ドット + バックスラッシュ) が必要。
Database name = <任意の名前>
MacBook で、Parallels VM の Windows 11 ARM にインストールされた LocalDB を使用している場合に次のような内容のエラーが表示されることがあります:
内部エラー: 関数呼び出しに失敗しました (SQL Server への接続を確立しているときにネットワーク関連またはインスタンス固有のエラーが発生しました。サーバーが見つからないかアクセスできませんでした。インスタンス名が正しいこと、および SQL Server がリモート接続を許可するように構成されていることを確認してください。(プロバイダー: SQL ネットワークインターフェース、エラー: 56 - レジストリに指定されている場所から SQLUserInstance.dll をロードできません。SQL Server Express の Local Database Runtime 機能が正しくインストールされていることを確認してください。))
このエラーが発生した場合は、インスタンスのパイプ名への接続を試みます (名前付きパイプを使用)。インスタンスのパイプ名を取得するには、次のコマンドを使用します:
C:\Dev>sqllocaldb info mssqllocaldb
Name: MSSQLLocalDB
Version: 13.1.4001.0
Shared name:
Auto-create: Yes
State: Running
Last start time: 5/27/2022 3:20:50 PM
Instance pipe name: np:\\.\pipe\LOCALDB#AC106136\tsql\query
その後、データストアのサーバー名を変更します:
.NET で Web アプリケーションを実行するときに、次の
警告が Kestrel または Docker コンテナに出力される場合があります:
Docker コンテナコンソールの警告:
{"EventId":7,"LogLevel":"Warning","Category":"Microsoft.AspNetCore.Session.SessionMiddleware","Message":"Error unprotecting the session cookie.","Exception":"System.Security.Cryptography.CryptographicException: The key {a047273b-f0b0-4f7b-a97c-c1da083a1b05} was not found in the key ring. For more information go to http://aka.ms/dataprotectionwarning at Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.UnprotectCore(Byte [ ] protectedData, Boolean allowOperationsOnRevokedKeys, UnprotectStatus\u0026 status) at Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.Unprotect(Byte [ ] protectedData) at Microsoft.AspNetCore.Session.CookieProtection.Unprotect(IDataProtector protector, String protectedText, ILogger logger)","State":{"Message":"Error unprotecting the session cookie.","{OriginalFormat}":"Error unprotecting the session cookie."}}
Kestrel コンソールの警告:
warn: Microsoft.AspNetCore.Session.SessionMiddleware
Error unprotecting the session cookie.
System.Security.Cryptography.CryptographicException: The key {...} was not found in the key ring. For more information go to http://aka.ms/dataprotectionwarning
- コンテナインスタンスを開始します。
- Web アプリケーションを実行します。
- コンテナを停止し、もう一度開始します。
- ブラウザーを再表示すると、エラーがコンテナに表示されます。
- Web アプリケーションを実行します (GeneXus で F5 キー)。
- 停止して Kestrel ウィンドウを閉じます。
- %USERPROFILE%\AppData\Local\ASP.NET\DataProtection-Keys から *.xml を削除します。
- GeneXus からもう一度実行します。
- ブラウザーを再表示すると、エラーが Kestrel の出力に表示されます。
このエラーが発生するのは、セッション Cookie の暗号化に使用されているキーが、別のコンテナインスタンスか Kestrel プロセスを実行するときに変わるからです。ASP.NET Core では、このような場合にデータの暗号化用に異なるキーが生成されます。このため、古い Cookie (前のコンテナインスタンスで生成されたもの) を含む Web ページが再表示されると、この Cookie をサーバー側で同じキーを使って復号化できません。エラーが出力され、新しいものが生成されます。
- セッションを分散型ストレージに保存します。
- ブラウザーで、新しいコンテナインスタンスまたは Kestrel プロセスにアクセスするために再表示する前に、この Web サイトの既存 Cookie をすべて削除します。
詳細については、次のページを参照してください: https://docs.microsoft.com/ja-jp/aspnet/core/security/data-protection/configuration/overview?view=aspnetcore-6.0#persisting-keys-when-hosting-in-a-docker-container
プロジェクトによっては、コンパイル時にこのエラーが発生する場合があります。もう一度コンパイルすると問題は発生しなくなります。
dotnet build -nologo --force -c Release /v:q /m /p:GxExternalReference=GeneXus.Security.API.Common.dll "d:\Models\MyKB\NetModel\build\LastBuild.sln"
C:\Program Files\dotnet\sdk\6.0.100\Microsoft.Common.CurrentVersion.targets(2304,5): error MSB4018: The "ResolveAssemblyReference" task failed unexpectedly. [ d:\Models\MyKB\NetModel\build\raca\raca.csproj ]
C:\Program Files\dotnet\sdk\6.0.100\Microsoft.Common.CurrentVersion.targets(2304,5): error MSB4018: System.IO.IOException: The process cannot access the file 'd:\Models\MyKB\NetModel\web\bin\Microsoft.Identity.Client.dll' because it is being used by another process. [ d:\Models\MyKB\NetModel\build\raca\raca.csproj ]
...
このエラーは、GeneXus が MSBuild を使用して
複数のプロジェクトを同時にコンパイルするときに発生します。これは、GeneXus でビルドされた .NET プロジェクトにおける既定の動作です。解決策は、並行してコンパイルを実行しないことです。並行してコンパイルを行うと、コンパイルのパフォーマンスが低下し、ビルドにかかる時間が長くなります。並行コンパイルが行われないようにするには、
[ MSBuild options ] プロパティから /m 修飾子を取り除くか、プロパティを /m:1 に設定してプロセッサを 1 つだけ使用するようにします。