System.ObjectDisposedException: '无法解析实例,也无法从此 LifetimeScope 创建嵌套生命周期

System.ObjectDisposedException: 'Instances cannot be resolved and nested lifetimes cannot be created from this LifetimeScope

我有一个异步控制器,我正试图从中调用两个不同的异步函数。像这样

   public async void Approvefiles(string[] data)
    {

       var response = await _mediator.Send(new persons.Query(data));
       await _mediator.Send(new employees.Query(data));

    }

我觉得一切都很好,但这会引发错误

System.ObjectDisposedException: 'Instances cannot be resolved and nested lifetimes cannot be created from this LifetimeScope as it has already been disposed.'

谁能指出我做错了什么?如果我只调用一个异步函数(例如仅 persons.Query),则不会发生此错误。

你的问题在这里:

 public async void Approvefiles(string[] data)

async void 方法几乎意味着在继续之前不会等待该方法完成(以及导致许多其他问题)。

所以我想你的请求范围在你的第二次 _mediator.Send 调用之前被清理了,这意味着没有什么可以解决的。

您需要将签名更改为:

public async Task Approvefiles(string[] data)

然后根据需要在您的控制器中等待该方法,以确保它在您的请求结束之前完成。

有一个关于为什么 async void 不好的答案here,了解更多详细信息。

我的两分钱。我的是一个小错误,我忘了等待异步调用。

所以我有如下这种异步扩展方法。

public static async Task<T> DeserializePostInMeWurkFormat<T>(this HttpClient httpClient, string route, HttpContent? content)
{
  var postResult = await httpClient.PostAsync(route, content);
  postResult.EnsureSuccessStatusCode();
  postResult.IsSuccessStatusCode.Should().BeTrue();
  var stringResponse = await postResult.Content.ReadAsStringAsync();
  var response = stringResponse.DeserializeWithCamelCasePolicy<T>();
  return response!;
}

然后我在没有等待的情况下打电话如下。

var postsResult = _client.DeserializePostInMeWurkFormat<CompanyOnboardDto>(OnboardCompanyRequest.Route, data);

得到异常如下

System.ObjectDisposedException HResult=0x80131622 Message=Instances cannot be resolved and nested lifetimes cannot be created from this LifetimeScope as it (or one of its parent scopes) has already been disposed. Source=Autofac

使用 await 更正了如下调用,现在可以正常工作了。

var postsResult = await _client.DeserializePostInMeWurkFormat<CompanyOnboardDto>(OnboardCompanyRequest.Route, data);