1731430550
2024-11-04 14:34:00
これは、私が最近 CMS 11 で実行中のプロジェクトで取り組んだケースとまったく同じです。明らかな理由もなく UI が壊れる問題に取り組むのは、常に興味深いものです。ブラウザのデバッガ モードを使用して CMS の内部動作を数時間調査した結果、ついに原因が判明しました。
問題
ユーザーがクリックしてコンテンツ領域にブロックを作成すると、リストが表示され、その後、ローカル ブロックが「このページ用」フォルダーに作成されます。ただし、ビューは次のようになります。
さらに、コンソールと[ネットワーク]タブに JS エラーがあり、リクエストの 1 つが 404 を返していることがわかります。
/EPiServer/cms/Stores/contenttype/?query=gegestuggestedcontenttypes&localAsset=true&parentReference=34647_142448&requestedTypes=episerver.core.blockdata&dojo.preventCache=1728643643176
ただし、バックエンドからの追加のログがないため、問題の原因がわかりにくくなっています。

興味深いことに、この問題はすべてのコンテンツ領域に影響を及ぼしたわけではありません。この問題は、特定のページ インスタンス内の特定のページでのみ発生し、認識できるパターンはありませんでした。
理由
この問題は UI コンテンツ タイプ ストアで発生しました。UI コンテンツ タイプ ストアは、本質的には CMS UI が接続する REST API です。 EPiServer.UI.Shell アセンブリを調査した結果、ブロック タイプの提案を取得しようとしていることがわかりました。これらは通常、上部に表示されるブロック タイプであり、通常は特定のコンテキストで使用される最近のタイプです。これらの提案を返すサービスは、IContentTypeAdvisor と呼ばれます。モック実装を注入した後、問題の原因を特定しました。より正確に言うと、親ページの ContentAssetID が間違っており、何らかの理由でデータベース内で解決できませんでした。これにより内部例外が発生し、上位層に伝播し、最終的にコンテンツ タイプ ストアの応答が中断されました。
解決策
この問題を解決するには、依存関係注入コンテナーから IContentTypeAdvisor のデフォルト実装を削除するだけで十分でした。
context.Services.RemoveAll(typeof(IContentTypeAdvisor));
context.Services.AddTransient();
もちろん、機能するにはブロックの提案が必要です。これを実現するために、私は独自のサービス実装を作成しました。この実装は基本的に、あらゆる例外をキャッチするラッパーとして機能し、Store API が引き続き動作できるようにします。エラーが発生した場合は、単に空のコレクションを返します。
internal class SafeContentTypeAdvisor : DefaultContentTypeAdvisor
{
public SafeContentTypeAdvisor(
ContentTypeAvailabilityService contentTypeAvailablilityService,
IContentLoader contentLoader,
FilterContentTypes filterContentTypes) : base(contentTypeAvailablilityService, contentLoader, filterContentTypes)
{
}
public override IEnumerableint> GetSuggestions(IContent parent, bool contentFolder, IEnumerablestring> requestedTypes)
{
try
{
return base.GetSuggestions(parent, contentFolder, requestedTypes);
}
catch (Exception)
{
return Enumerable.Emptyint>();
}
}
}
問題は解決しました!編集者は問題なくローカル ブロックを再度作成できるようになりました。
#ブロックタイプの選択が機能しない