c# 如何正确传递 HttpRequestMessage 并在函数外返回 HttpRequestMessage 而不会泄漏
Posted
技术标签:
【中文标题】c# 如何正确传递 HttpRequestMessage 并在函数外返回 HttpRequestMessage 而不会泄漏【英文标题】:c# How to properly pass HttpRequestMessage in and return HttpRequestMessage out of function without leaks 【发布时间】:2022-01-12 14:35:09 【问题描述】:我正在尝试在 C# 中实现一个 rest api 客户端。我大致这样创建了每个请求:
public async Task<string> CallCreateJob()
HttpRequestMessage requestMessage =
new HttpRequestMessage(HttpMethod.Post, URL))
requestMessage.Content = new StringContent("some content");
var getRequestResponse = await RunCallWithAuth(requestMessage);
string rawResponse = await getRequestResponse.Content.ReadAsStringAsync();
return rawResponse;
但重要的是,我想用这样的身份验证来结束通话:
public async Task<HttpResponseMessage> RunCallWithAuth(HttpRequestMessage requestMessage)
requestMessage.Headers.Add("token", getToken()); //Token assumed to be available.
HttpResponseMessage firstResponse= await client.SendAsync(requestMessage);
if(firstResponse.StatusCode == System.Net.HttpStatusCode.Unauthorized)
if (Refresh()) //updates token in getToken() call.
requestMessage.Headers.Add("token", getToken());
HttpResponseMessage secondResponse = await client.SendAsync(requestMessage);
if(secondResponse .StatusCode != System.Net.HttpStatusCode.Unauthorized)
return secondResponse;
else
throw new IOException("Could not authenticate");
else
throw new IOException("Could not authenticate");
else
return firstResponse;
我很紧张的部分是当我在函数中传递一个HttpRequestMessage
并从我的函数返回一个HttpResponseMessage
对象时。自从阅读HttpResponseMessage
以来,使用using
语句或在我不再需要它时使用Dispose
似乎是一种好习惯。但我不知道标准 c# 在返回对象时会做什么。会动吗?还是抄袭?有没有办法确保HttpResponseMessage
中的所有资源都得到妥善处理?同样的问题也适用于将对象传递给函数。是否有关于如何使用 http 消息执行此操作的标准做法?
【问题讨论】:
如果你的方法返回一个 IDisposable 的实例(它在这里执行)然后由调用者来处理它,一旦它返回它,该方法就会失去所有控制权。返回对象时,c# 没有特殊处理 但它仍然是同一个对象,对吧?所以我所要做的就是在上层函数中处理? 【参考方案1】:您可以在完成后将其释放到调用函数中
using (var request = new HttpRequestMessage(HttpMethod.Post, URL))
using (var response = await RunCallWithAuth(request))
// do stuff with the response here
一旦你从一个函数返回一个 IDisposable,它就变成了调用者的责任
【讨论】:
以上是关于c# 如何正确传递 HttpRequestMessage 并在函数外返回 HttpRequestMessage 而不会泄漏的主要内容,如果未能解决你的问题,请参考以下文章
c# 如何正确传递 HttpRequestMessage 并在函数外返回 HttpRequestMessage 而不会泄漏