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

时间:2014-07-30 21:28:33

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

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

  

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;
}

2 个答案:

答案 0 :(得分:10)

您正在调用两次相同的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 :(得分:0)

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