如何在原始请求包含内容时克隆HttpRequestMessage?

我正在尝试使用此答案中概述的方法克隆请求: https : //stackoverflow.com/a/18014515/406322

但是,如果原始请求具有内容,则会收到ObjectDisposedException。

你如何可靠地克隆HttpRequestMessage?

这应该是诀窍:

public static async Task CloneHttpRequestMessageAsync(HttpRequestMessage req) { HttpRequestMessage clone = new HttpRequestMessage(req.Method, req.RequestUri); // Copy the request's content (via a MemoryStream) into the cloned object var ms = new MemoryStream(); if (req.Content != null) { await req.Content.CopyToAsync(ms).ConfigureAwait(false); ms.Position = 0; clone.Content = new StreamContent(ms); // Copy the content headers if (req.Content.Headers != null) foreach (var h in req.Content.Headers) clone.Content.Headers.Add(h.Key, h.Value); } clone.Version = req.Version; foreach (KeyValuePair prop in req.Properties) clone.Properties.Add(prop); foreach (KeyValuePair> header in req.Headers) clone.Headers.TryAddWithoutValidation(header.Key, header.Value); return clone; } 

如果在内容上调用LoadIntoBufferAsync,则可以保证内容在HttpContent对象内缓冲。 剩下的唯一问题是读取流不会重置位置,因此您需要ReadAsStreamAsync并设置流Position = 0。

我的例子与卡洛斯表示的非常相似……

  private async Task CloneResponseAsync(HttpResponseMessage response) { var newResponse = new HttpResponseMessage(response.StatusCode); var ms = new MemoryStream(); foreach (var v in response.Headers) newResponse.Headers.TryAddWithoutValidation(v.Key, v.Value); if (response.Content != null) { await response.Content.CopyToAsync(ms).ConfigureAwait(false); ms.Position = 0; newResponse.Content = new StreamContent(ms); foreach (var v in response.Content.Headers) newResponse.Content.Headers.TryAddWithoutValidation(v.Key, v.Value); } return newResponse; } 

“`