StringContent是否会随HttpRequestMessage一同自动释放?
问题结论
StringContent/HttpContent 不需要单独声明using块,HttpRequestMessage释放时会同步释放绑定的Content资源。
底层实现逻辑
.NET 官方运行时库中HttpRequestMessage的Dispose方法内置了对应逻辑:执行自身资源释放时,会自动检查Content属性是否为非空,如果存在绑定的HttpContent实例,会主动调用其Dispose()方法完成资源释放。
写法对比
- 你给出的第一种写法完全合法,不会存在资源泄漏问题:
var content = new StringContent("test"); using (var requestMessage = new HttpRequestMessage(HttpMethod.Post, requestUri)) { requestMessage.Content = content; var response = await HttpClient.SendAsync(requestMessage).ConfigureAwait(false); }
- 第二种嵌套
using的写法虽然也不会出错,但属于冗余操作,没有必要额外增加嵌套层级。
更优写法推荐
C# 8及以上版本可以使用using声明简化写法,无需额外嵌套大括号:
// 方法执行结束时自动释放requestMessage,连带释放绑定的StringContent using var requestMessage = new HttpRequestMessage(HttpMethod.Post, requestUri); requestMessage.Content = new StringContent("test"); var response = await HttpClient.SendAsync(requestMessage).ConfigureAwait(false);
注意事项
不要将同一个HttpContent实例绑定到多个HttpRequestMessage,第一个请求释放时会将Content标记为已释放,后续请求使用该Content时会抛出ObjectDisposedException异常。
内容的提问来源于stack exchange,提问作者jn025
相关产品推荐
相关产品推荐

