最近のアクセス:
.NET ジェネレーターのトラブルシューティング

ここでは、.NET ジェネレーターの使用に関わる一般的なエラーと、それを迅速に解決する方法を示します。

SQL LocalDB 接続エラー

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

その後、データストアのサーバー名を変更します:
イメージ:50943.png
 

.NET で Web アプリケーションを実行するときの警告

.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
 

Docker で再現する手順:

  1. コンテナインスタンスを開始します。
  2. Web アプリケーションを実行します。
  3. コンテナを停止し、もう一度開始します。
  4. ブラウザーを再表示すると、エラーがコンテナに表示されます。
 

Kestrel Web サーバーを実行している場合に Windows で再現する手順:

  1. Web アプリケーションを実行します (GeneXus で F5 キー)。
  2. 停止して Kestrel ウィンドウを閉じます。
  3. %USERPROFILE%\AppData\Local\ASP.NET\DataProtection-Keys から *.xml を削除します。
  4. GeneXus からもう一度実行します。
  5. ブラウザーを再表示すると、エラーが Kestrel の出力に表示されます。
このエラーが発生するのは、セッション Cookie の暗号化に使用されているキーが、別のコンテナインスタンスか Kestrel プロセスを実行するときに変わるからです。ASP.NET Core では、このような場合にデータの暗号化用に異なるキーが生成されます。このため、古い Cookie (前のコンテナインスタンスで生成されたもの) を含む Web ページが再表示されると、この Cookie をサーバー側で同じキーを使って復号化できません。エラーが出力され、新しいものが生成されます。

エラーを回避する方法

  1. セッションを分散型ストレージに保存します。
  2. ブラウザーで、新しいコンテナインスタンスまたは 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

error MSB4018: "ResolveAssemblyReference" タスクの予期しない失敗

プロジェクトによっては、コンパイル時にこのエラーが発生する場合があります。もう一度コンパイルすると問題は発生しなくなります。
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 つだけ使用するようにします。
 


サブページ
Created: 23/04/24 18:11 by Admin Last update: 23/05/24 03:22 by Admin
カテゴリ
Powered by GXwiki 3.0