【发布时间】:2018-10-10 15:10:44
【问题描述】:
我正在研究一些将 Http 请求中继到另一个 URL 的遗留代码的问题。它是一个 API 控制器,它读取请求并将其异步转发到另一个地址。
极少情况下,它会引发“无法访问已处置的对象”异常 - 本问题后面会显示完整的堆栈跟踪。它似乎在 HttpClient 调用 SendAsync 方法的地方。我认为这可能是 ResponseHeadersRead 选项 - 我怀疑它正在发送一个大数据包并且它被关闭,因为它刚刚读取了标题并退出。只是想我会和你们一起理智地检查一下,为了你们的想法。我会将选项更改为 ResponseContentsRead 选项,看看效果如何(但错误可能需要很长时间才能浮出水面)。
代码如下:
using (var client = new HttpClient())
{
var request = BuildRelayHttpRequest(Request);
await client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead);
}
private static HttpRequestMessage BuildRelayHttpRequest(HttpRequestMessage incomingRequest)
{
var forwardToUrl = new Uri(ConfigurationManager.AppSettings["ForwardFeedURL"]);
var relayRequest = new HttpRequestMessage(incomingRequest.Method, forwardToUrl);
if (incomingRequest.Method != HttpMethod.Get && incomingRequest.Content != null)
{
relayRequest.Content = incomingRequest.Content;
}
//Copies contents
relayRequest.Content = incomingRequest.Content;
return relayRequest;
}
这里是个例外:
System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'System.Web.Http.WebHost.HttpControllerHandler+LazyStreamContent'.
at System.Net.Http.HttpContent.CheckDisposed()
at System.Net.Http.HttpContent.CopyToAsync(Stream stream, TransportContext context)
at System.Net.Http.HttpClientHandler.GetRequestStreamCallback(IAsyncResult ar)
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
at CHO.Web.Services.ETrains.Controllers.ETrainsApiController.<CopyandForwardFeedAsyn>d__18.MoveNext() in \Controllers\MyAPIController.cs:line 289
注意,第 289 行是“await client.SendAsync”代码行
【问题讨论】:
标签: c# asp.net-web-api2