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# 中如何正确地将 int 数组传递给函数

c# 如何正确传递 HttpRequestMessage 并在函数外返回 HttpRequestMessage 而不会泄漏

如何正确地将浮点指针从 C 库传递到其 C# 包装器

如何正确地将这些转换为 c#,marshall,以便我可以将这些结构传递给 DLL (c++)?

从 C# 到 C++ 的调用无法正确传递参数

C# 为啥我的变量不能在表单之间正确传递?