1748980660
2025-06-02 13:17:00
キャメルケースを実施するターゲットアクションフィルター
私の中で 前のブログ投稿、NUGETパッケージを更新した後、Optimizely CMSエクスポートでJSONフォーマットで抱えている問題について議論しました。具体的には、 /episerver/episerver.cms.ui.admin/exportdata/getExporttatus エンドポイントが返されました パスカルケース JSONプロパティ名、フロントエンドが予想されるサイトの他の部分を壊す キャメルケース。
それがUIの障害につながりました。特に、終わりのないロードスピナーです。グローバルJSON設定に影響を与えることなくこれに対処するために、 アクションフィルター これにより、この特定のルートのキャメルケースのフォーマットが保証されます。これがどのように機能しますか。
要約:JSONのフォーマットが重要な理由
多くのJavaScriptフレームワーク(ReactやAngularなど)は、CamelcaseのJSONプロパティ名を期待しています。反応が予期せずにPascalcaseで発生すると、バインディングが破損し、データが欠落したり、UIの完全な障害にさえつながります。
GSON設定をグローバルに変更する代わりに、CMS全体で意図しない結果をもたらす可能性がありますが、最良のアプローチは ターゲットを絞った修正 それが当てはまります のみ 問題のあるエンドポイントに。
解決策:輸出ステータスのためのCamelcase JSON
このASP.NETコアアクションフィルターは、/episerver/episerver.cms.ui.admin/exportdata/getExporttatusからのJSON応答を保証します。
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.AspNetCore.Mvc.Formatters;
using System.Text.Json;
using System.Linq;
using System.Text.Json.Serialization.Metadata;
namespace Website.API.Filters
{
///
/// Action filter to enforce camelCase JSON for /EPiServer/EPiServer.Cms.UI.Admin/ExportData/GetExportStatus responses.
///
public class CamelCaseJsonForExportStatusFilter : IActionFilter
{
public void OnActionExecuting(ActionExecutingContext context)
{
// No action needed before execution
}
public void OnActionExecuted(ActionExecutedContext context)
{
// Only apply to the specific route
var path = context.HttpContext.Request.Path.Value;
if (!string.Equals(path, "/EPiServer/EPiServer.Cms.UI.Admin/ExportData/GetExportStatus",
StringComparison.OrdinalIgnoreCase))
return;
if (context.Result is ObjectResult objectResult)
{
// Find the SystemTextJsonOutputFormatter and update its options
var jsonFormatter = objectResult.Formatters
.OfType()
.FirstOrDefault();
if (jsonFormatter != null)
{
// Update the naming policy to camelCase
jsonFormatter.SerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
}
else
{
objectResult.Formatters.Add(new SystemTextJsonOutputFormatter(
new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
WriteIndented = false,
TypeInfoResolver = new DefaultJsonTypeInfoResolver()
}
));
}
}
}
}
}
プラグインする方法
startup.csに以下を追加して、フィルターをグローバルに登録します(ルートごとに自己フィルターを備えているため):
フィルターは、リクエストが /exportData /getExportStatusの場合にのみロジックを実行するため、アプリ全体で登録するのは安全です。
それがどのように機能するか
- 応答を傍受します
- フィルターを実装します iActionFilter、 アクションが実行された後の応答の変更。
- OnactionExecuting 実行前に変更が不要なため、空のままです。
- OnactionExected 要求パスがエクスポートステータスエンドポイントと一致するかどうかを確認します。
- 応答が次の場合 ObjectResult、 既存のものを検索します SystemTextJSonOutputFormatter。
- 見つかった場合、それはそれを更新します serializeroptions.propertynamingpolicy に jsonnamingpolicy.camelcase。
- フォーマッタが存在しない場合、それ 追加します 正しい設定を備えた新しいもの。
なぜこのアプローチ?
- スコープされた修正 – 影響のみ /データのエクスポート/エクスポートステータスを取得します、他のJSON応答を触れられないままにします。
- 最小限のオーバーヘッド – 可能であれば既存のフォーマッタを変更し、パフォーマンスを最適化します。
- 将来のプルーフ – 最適化されたCMSが後でその動作を更新しても、フォーマッタが存在するようにします。
結論
このターゲットアクションフィルターは、Optimizely CMSでの予期しないJSONのフォーマット問題を防ぎます。キャメルケースを実施することにより のみ エクスポートステータス応答の場合、グローバル設定への不必要な変更を回避しながら、UIの障害を排除します。
代替のアプローチや考えがある場合は、コメントにドロップしてください。
2025年6月2日
#Optimizely #CMSエクスポートデータでJSONケーシングを修正します