【问题标题】:Blazor Webassembly - System.AggregateExceptionBlazor Webassembly - System.AggregateException
【发布时间】:2020-06-26 05:50:40
【问题描述】:

我创建了一个带有标准 CRUD 功能的 RESTapi。 我已经用邮递员测试了所有功能,它们可以正常工作。

我正在使用 Refit 从客户端 blazor 项目中使用这些函数,除了 Delete 函数之外,所有函数都像 sharm 一样工作。当我运行它时,我得到一个带有消息的 System.AggregateException “发生了一个或多个错误。(无效参数:源不能为空且必须有长度)”。

Delete 方法有一个 guid 参数,在代码中关于创建、编辑和删除的一切看起来都一样,但删除很困难。我在这里疯了,有人能弄清楚可能是什么问题吗?

我正在使用一些组件(Page + List -> ListItem,管道看起来像这样:

  1. 列表项
 <button class="btn btn-danger" @onclick="@(() => Delete.InvokeAsync(Item))">Delete</button>

[Parameter] public BIMObjectCategoryResponse Item { get; set; }
[Parameter] public EventCallback<BIMObjectCategoryResponse> Delete { get; set; }
  1. 列表
[Parameter] public IEnumerable<BIMObjectCategoryResponse> Items { get; set; }
[Parameter] public EventCallback<BIMObjectCategoryResponse> Delete { get; set; }
  1. 页面
// Callback - Delete
void Delete(BIMObjectCategoryResponse item)
{
    var response = bimService.DeleteBIMObjectCategoryAsync(item.BIMObjectCategoryGUID);
}

想法?

更多的澄清和简化。 在测试了下面的几个答案和建议后,问题似乎与回调的原理无关,而与具体的方法有关。我所做的是创建一个仅运行 Init 函数的简单页面。

// Initialize
protected async override Task OnInitializedAsync()
{
    Guid guid = Guid.Parse("1e9daac1-1a3e-4eab-8e49-45c2993aba4c");

    Console.WriteLine("BeginGet");
    var response1 = await bimService.GetBIMObjectCategoryAsync(guid);
    Console.WriteLine(jsonService.GetString(response1.Content.Data));
    Console.WriteLine("EndGet");

    Console.WriteLine("BeginDelete");
    var response2 = await bimService.DeleteBIMObjectCategoryAsync(guid);
    Console.WriteLine(jsonService.GetString(response2.Content));
    Console.WriteLine("EndDelete");
}

【问题讨论】:

  • 当我运行调试时,它显示调用没有到达 webapi,在此之前它失败了。我为 get/update/create 尝试了相同的操作,它们都以 web api 的调试模式结束。
  • Henrik,你肯定是对的,我添加了一些更完整的代码。请检查一下。
  • 是的,我实现了您推荐的逻辑,但没有帮助。
  • 请显示删除方法的完整代码。另外,显示 Program.cs 文件的代码。我猜这个问题与正在使用的 HttpMessagelHandler 单声道有关。

标签: entity-framework asp.net-core-webapi client-side blazor webassembly


【解决方案1】:

回到这个问题,我已经为这个问题添加了一个错误报告,因为它使用标准的 httpclient 而不是 Refit 可以完美地工作。所以我们现在可以关闭它。感谢所有的努力:) /亨里克

【讨论】:

    【解决方案2】:

    您的async 流程有误,最好先修复它。该错误似乎表明您的父(页面)组件在子项之前呈现,然后不再存在。

    从 ListItem 开始,您可能可以在 @onclick lambda 中使用 await 来修复它,但我更喜欢让该过程更加明显:

    <button class="btn btn-danger" @onclick="DeleteItem">Delete</button>
    
    @code {
    [Parameter] public BIMObjectCategoryResponse Item { get; set; }
    [Parameter] public EventCallback<BIMObjectCategoryResponse> Delete { get; set; }
    
      async Task DeleteItem()
      {
        // maybe you need Response? 
        var response = await Delete.InvokeAsync(Item);
      }
    }
    

    您没有在页面中发布处理代码,但也必须正确链接异步流。

    【讨论】:

    • 我在最初的问题中添加了一种简化的方法。感谢您的帮助:)
    【解决方案3】:

    您的 Page 组件的结构类似于以下内容,对吗?

    - A (GrandParentComponent)
       -- B (ParentComponent)
       --- C (ChildComponent)
    

    请参阅this answer 这些组件如何通信... 并将我在此处所做的应用于您的删除操作。

    请注意,在我的回答结束时,我建议改用通知服务,以启用组件之间的通信,我相信这在您的情况下是一个可行的解决方案。 See here my answer 如何定义和使用通知服务。请注意,该线程中的第二个答案建议使用级联值和参数。这是实现组件之间通信的第三种方式。它相当笨重并且可能有问题。我从不推荐它,但它仍然是一个合法的工具,并且被框架本身大量使用。在我看来,当两个组件之间进行通信时,事件委托是最好的选择。否则,在我看来,状态模式和通知模式的组合是最简单、最优雅的解决方案。

    希望这会有所帮助...

    【讨论】:

    • 谢谢,我添加了一些更完整的代码。请检查一下。
    猜你喜欢
    • 2020-08-19
    • 2021-02-08
    • 2020-06-28
    • 2020-09-02
    • 1970-01-01
    • 2020-06-06
    • 2020-10-09
    • 2020-09-11
    相关资源
    最近更新 更多