使用asp.net核心在HttpRequestMessage和HttpResponseMessage上调用Dispose(或不调用)的最佳做法是什么?
示例:
protected override async Task<AuthenticationTicket> CreateTicketAsync(ClaimsIdentity identity, AuthenticationProperties properties, OAuthTokenResponse tokens)
{
// Get the Google user
var request = new HttpRequestMessage(HttpMethod.Get, Options.UserInformationEndpoint);
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", tokens.AccessToken);
var response = await Backchannel.SendAsync(request, Context.RequestAborted);
response.EnsureSuccessStatusCode();
var payload = JObject.Parse(await response.Content.ReadAsStringAsync());
...
}
和
https://github.com/aspnet/Security/blob/1.0.0/src/Microsoft.AspNetCore.Authentication.Facebook/FacebookHandler.cs#L37-L40
这两个例子都没有调用Dispose
这可能是遗漏吗?或者它背后是否有正当理由,可能是因为该方法是异步的?当然,CG最终会最终确定它们,但这是在这种情况下这样做的最佳做法,为什么?请注意,上面的示例是ASP.NET核心中间件组件的一部分。
答案 0 :(得分:6)
我在代码示例所属的github存储库上打开了一个问题。
https://github.com/aspnet/Security/issues/886
在这些情况下并不重要。处置请求或响应仅调用其内容字段上的Dispose。在各种HttpContent实现中,只有StreamContent需要处理任何东西。 HttpClient的默认SendAsync完全缓冲响应内容并处理流,因此调用者无需做任何事情。
但是为了不让奇怪的错误发生,我们最好处理这些对象。 MemoryStream是另一个类,由于其当前的底层实现,它通常也不会被处置。
https://stackoverflow.com/a/234257/6524718
如果你完全确定你永远不想从MemoryStream转移到另一种类型的流,那么对于不调用Dispose不会有任何伤害。然而,这通常是一种很好的做法,部分原因是如果你做了改变以使用不同的Stream,你不希望被难以发现的bug所困扰,因为你很早就选择了简单的方法。 (另一方面,有YAGNI论点......)
无论如何,这样做的另一个原因是新的实现可能会引入将在Dispose上释放的资源。