You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在.NET MAUI组件中渲染application/ld+json出现空值的问题

.NET Blazor组件渲染application/ld+json为空的解决方法

你的代码存在三个核心问题导致渲染结果为空:

  • 调用方法时未输出返回值:@{ getBannerSeoText(); }仅执行方法,未将返回的JSON字符串输出到页面
  • 同步阻塞异步操作:用Task.Run(...).Result会引发线程死锁,导致方法无法正常返回结果
  • HttpClient不当实例化:每次创建HttpClient会造成资源浪费,甚至引发连接耗尽

修正后的代码

<script type="application/ld+json">
    @await GetBannerSeoTextAsync()
</script>

@code {
    [Inject]
    private IHttpClientFactory HttpClientFactory { get; set; }

    [Inject]
    private IHttpContextAccessor HttpContextAccessor { get; set; }

    [Inject]
    private IUtilityService UtilityService { get; set; }

    private async Task<string> GetBannerSeoTextAsync()
    {
        try
        {
            var hostUrl = $"{HttpContextAccessor.HttpContext.Request.Scheme}://{HttpContextAccessor.HttpContext.Request.Host}";
            string fileUrl = $"{hostUrl}/{UtilityService.GetSeoFolderUrl()}/carousal.json";
            
            var client = HttpClientFactory.CreateClient();
            return await client.GetStringAsync(fileUrl);
        }
        catch (Exception)
        {
            // 请求失败时返回空JSON对象,避免格式错误
            return "{}";
        }
    }
}

关键修改说明

  1. 异步化处理:将方法改为async Task<string>类型,用await替代同步阻塞的.Result,彻底避免死锁问题
  2. 正确输出内容:用@await GetBannerSeoTextAsync()直接将JSON字符串输出到script标签内
  3. HttpClient最佳实践:注入IHttpClientFactory创建客户端,避免资源泄漏
  4. 异常兜底:添加捕获逻辑,防止请求失败时返回空内容导致JSON格式错误

额外检查项

  • 直接在浏览器中访问carousal.json的URL,确认文件能正常返回合法JSON
  • 确保Program.cs中已注册必要服务:
    builder.Services.AddHttpContextAccessor();
    builder.Services.AddHttpClient();
    builder.Services.AddScoped<IUtilityService, UtilityService>();
    

内容的提问来源于stack exchange,提问作者Ali

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 13:12:36