【问题标题】:The request message was already sent. Cannot send the same request message multiple times请求消息已发送。无法多次发送相同的请求消息
【发布时间】:2014-07-30 21:28:32
【问题描述】:

我的代码有什么问题吗?我不断收到此错误:

System.InvalidOperationException:请求消息已发送。不能多次发送相同的请求消息。

我的 HttpRequestMessage 在 Func 中,所以我认为每次传入 func() 时都会收到一个全新的请求。

public async Task<HttpResponseMessage> GetAsync(HttpRequestMessage request)
{
     return await RequestAsync(() => request);
}

public async Task<HttpResponseMessage> RequestAsync(Func<HttpRequestMessage> func)
{
   var response = await ProcessRequestAsync(func);

    if (response.StatusCode == HttpStatusCode.Unauthorized)   
    {
        WaitForSomeTime();
        response = await ProcessRequestAsync(func);        
    }

    return response;
}

private async Task<HttpResponseMessage> ProcessRequestAsync(Func<HttpRequestMessage> func)
{
    var client = new HttpClient();
    var response = await client.SendAsync(func()).ConfigureAwait(false);
    return response;
}

【问题讨论】:

  • 你在func中作为参数传递了什么?
  • @I3arnon 我已经向来电者更新了我的问题。
  • 那么我的猜测准确无误

标签: c# .net async-await dotnet-httpclient func


【解决方案1】:

您两次调用相同的func 参数:

var response = await ProcessRequestAsync(func);
//...
response = await ProcessRequestAsync(func);

在这种情况下,func 每次都返回相同的请求。每次调用它时它都不会生成一个新的。如果您确实每次都需要不同的请求,那么 func 需要在每次调用时返回一条新消息:

var response = await GetAsync(() => new HttpRequestMessage()); // Create a real request.

public async Task<HttpResponseMessage> GetAsync(Func<HttpRequestMessage> requestGenerator)
{
     return await RequestAsync(() => requestGenerator());
}

【讨论】:

  • 谢谢@i3arnon。我会试一试并报告。
  • 看起来就是这样。问题——如果我只想在 WaitForSometime() 之后更改 HttpRequestMessage 的标头属性,是否应该使用新标头重新创建对象并将其分配回相同的函数?
  • @Prabhu 实际上,我认为使用func 而不仅仅是传递一个简单的参数没有意义。然后您可以尝试更改标题并再次发送。如果失败,您可以创建一个带有标题的新标题并从旧标题中复制相关属性。
  • @Prabhu 我明白了。那么是的,对 func 的第二次调用必须创建一个新的请求实例,并在再次发送之前设置您的标头。
  • 如果您使用 Polly 重试您的请求,这是特别有用的建议。如果您所做的只是重新发送 same 请求(我在这里的原因!),那么您会得到与 OP 提到的相同的异常。
【解决方案2】:

我有同样的问题,但我的代码没有重复。原来我在异步过程中添加了一个手表。那只手表在我单步执行代码时调用了该过程,因此当我到达线路时,我试图调试它并显示此错误消息而崩溃。 删除所有手表解决了这个问题。 把这个留给可能有同样问题的其他人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-20
    • 2016-04-14
    • 2023-03-24
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多