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

Pra*_*bhu 8 .net c# func async-await dotnet-httpclient

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

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;
}
Run Code Online (Sandbox Code Playgroud)

i3a*_*non 14

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

var response = await ProcessRequestAsync(func);
//...
response = await ProcessRequestAsync(func);
Run Code Online (Sandbox Code Playgroud)

在这种情况下func,每次都返回相同的请求.每次调用它时都不会生成新的.如果您每次真正需要不同的请求,则func每次调用都需要返回一条新消息:

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

public async Task<HttpResponseMessage> GetAsync(Func<HttpRequestMessage> requestGenerator)
{
     return await RequestAsync(() => requestGenerator());
}
Run Code Online (Sandbox Code Playgroud)

  • 例如,如果您使用 Polly 重试您的请求,这是特别有用的建议。如果您所做的只是重新发送*相同的*请求(我在这里的原因!),那么您会得到与OP提到的相同的异常。 (9认同)

Lav*_*ysh 7

我遇到了同样的问题,但我的代码没有重复。结果我在异步进程上添加了一个监视。当我单步执行代码时,该手表调用了该进程,因此当我到达该行时,我试图调试它,但它崩溃并显示此错误消息。取下所有手表就解决了问题。将此留给其他可能遇到同样问题的人。