使用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());
    ...
 }
Run Code Online (Sandbox Code Playgroud)
和 
 https://github.com/aspnet/Security/blob/1.0.0/src/Microsoft.AspNetCore.Authentication.Facebook/FacebookHandler.cs#L37-L40
 
这两个例子都没有调用Dispose
这可能是遗漏吗?或者它背后是否有正当理由,可能是因为该方法是异步的?当然,CG最终会最终确定它们,但这是在这种情况下这样做的最佳做法,为什么?请注意,上面的示例是ASP.NET Core Middleware组件的一部分.
我在代码示例所属的github存储库上打开了一个问题.
https://github.com/aspnet/Security/issues/886
在这些情况下,这并不重要.处置请求或响应仅调用其内容字段上的Dispose.在各种HttpContent实现中,只有StreamContent需要处理任何东西.HttpClient的默认SendAsync完全缓冲响应内容并处理流,因此调用者无需做任何事情.
但是为了不让奇怪的错误发生,我们最好处理这些对象.MemoryStream是另一个类,由于其当前的底层实现,它通常也不会被处置.
如果你完全确定你永远不想从MemoryStream转移到另一种流,那么不打算不调用Dispose会对你造成任何伤害.然而,这通常是一种很好的做法,部分原因是如果你做了改变以使用不同的Stream,你不希望被难以发现的bug所困扰,因为你很早就选择了简单的方法.(另一方面,有YAGNI的论点......)
无论如何,这样做的另一个原因是新实现可能会引入将在Dispose上释放的资源.
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           5791 次  |  
        
|   最近记录:  |