【问题标题】:c# How to properly pass HttpRequestMessage in and return HttpRequestMessage out of function without leaksc# 如何正确传递 HttpRequestMessage 并在函数外返回 HttpRequestMessage 而不会泄漏
【发布时间】: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# 没有特殊处理
  • 但它仍然是同一个对象,对吧?所以我所要做的就是在上层函数中处理?

标签: c# http memory-management resource-management


【解决方案1】:

您可以在完成后将其释放到调用函数中

using (var request = new HttpRequestMessage(HttpMethod.Post, URL))
using (var response = await RunCallWithAuth(request))
{
   // do stuff with the response here
}

一旦你从一个函数返回一个 IDisposable,它就变成了调用者的责任

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多