2016-06-28 95 views
6

对于使用asp.net核心对HttpRequestMessage和HttpResponseMessage调用Dispose(或不)的最佳做法是什么?未调用在asp.net核心中对HttpRequestMessage和HttpResponseMessage进行处理

例子:

https://github.com/aspnet/Security/blob/1.0.0/src/Microsoft.AspNetCore.Authentication.Google/GoogleHandler.cs#L28-L34

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

难道这是一个疏漏?或者是否有一个有效的原因,也许是因为该方法是异步?编辑1:当然CG最终会最终确定它们,但是在这种情况下这是最好的做法吗?为什么?

编辑2:上述实施例是我在哪里的代码示例属于的github库打开的问题asp.net核心中间件组件

+0

一旦超出范围而不是(异步)使用,它将自行处置。 –

+0

当然,CG会最终敲定它们,但这是在这种情况下最好的做法,为什么? – PaulMiami

+0

如果在异步方法结束之前调用dispose,则会引发异常。 –

回答

4

的一部分。

https://github.com/aspnet/Security/issues/886

这不是在这些情况非常重要。处理请求或响应仅在其内容字段上调用Dispose。在各种HttpContent实现中,只有StreamContent需要处理任何东西。 HttpClient的默认SendAsync完全缓冲响应内容并处理流,所以调用者无需做任何事情。

但是为了不让怪异的错误发生,我们最好放弃这些对象。 MemoryStream是另一个类,由于其当前的基础实现,通常也不会处理它。

https://stackoverflow.com/a/234257/6524718

如果你绝对相信,你从来没有想从一个MemoryStream到另一种流的移动,它不会对任何伤害你不调用Dispose。然而,这通常是一种好的做法,部分原因是因为如果您改变使用不同的Stream,您不希望被一个难以发现的错误困扰,因为您早期选择了简单的方法。 (另一方面,YAGNI的论点是...)

无论如何,做这件事的另一个原因是新的实现可能会引入资源,这些资源将在Dispose上释放。