请求消息已经发送。无法多次发送相同的请求消息。

40

这里的代码有什么问题吗?我一直收到这个错误:

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
@I3arnon,我已经更新了我的问题,并附上了调用者。 - Prabhu
1
那么我的猜测一直准确到了名字。 - i3arnon
2个回答

39

您正在两次调用相同的 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());
}

1
谢谢@i3arnon。我会尝试并回报结果。 - Prabhu
@Prabhu,我实际上看不出使用func而不是只传递一个简单参数的意义。然后你可以尝试更改头并重新发送。如果失败了,你可以创建一个带有标头的新对象,并从旧对象中复制相关属性。 - i3arnon
1
@Prabhu 我明白了。那么是的,对 func 的第二次调用必须创建一个新的请求实例,并在再次发送之前仅设置您的标头。 - i3arnon
11
如果你使用 Polly 来重试请求,这条建议尤其有用。如果你只是重新发送了相同的请求(这也是我在这里的原因!),那么你会收到与 OP 提到的相同异常。 - Larry Smith
我已经尝试了相同的方法,但仍然遇到了问题。有人可以帮我解决一下吗? - sar
显示剩余2条评论

7

我遇到过同样的问题,但我的代码中没有重复。结果发现我在异步进程上添加了一个监视器。在我逐步调试代码时,该监视器会调用该进程,因此当我到达尝试调试的行时,它会因为这个错误消息而崩溃。 删除所有监视器解决了问题。 为了其他可能遇到同样问题的人,我留下了这里。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接