【问题标题】:.Net Core 2.2, PutAsync, HttpContent Question.Net Core 2.2,PutAsync,HttpContent 问题
【发布时间】:2019-05-28 00:52:46
【问题描述】:

我正在从使用 express 的节点过渡到 .Net Core 2.2。我正在尝试创建一个 put 请求以将更新推送到 api。我发现我可以用

创建它

var client = new HttpClient(); client.PutAsync(url, httpContent)

我的第一个问题是,如何创建 httpContent?通常在这种情况下,我会创建一个 JSON 对象,但这里当然行不通。

我的第二个问题是,我使用的是 .Net Core 2.2。使用 HttpClient 是正确的方式还是应该使用 Factory?

【问题讨论】:

    标签: .net-core-2.2


    【解决方案1】:

    请参考以下代码sn-p发出post请求,同样可以实现put请求,只需将方法改为Put即可。

    protected async Task<Tuple<HttpStatusCode, TOutput>> MakeRequest<TInput, TOutput>(string baseAdrress, string apiUrl, TInput data)
    {
        var contentData = new StringContent(JsonConvert.SerializeObject(data), Encoding.UTF8, "application/json");
    
        var client = new HttpClient();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        client.BaseAddress = new Uri(baseAdrress);
    
        var response = await client.SendAsync(new HttpRequestMessage
        {
            RequestUri = new Uri(apiUrl, UriKind.Relative),
            Content = contentData,
            Method = HttpMethod.Post
        });
    
        if (response.StatusCode == HttpStatusCode.InternalServerError)
        {
            return Tuple.Create(HttpStatusCode.InternalServerError, default(TOutput));
        }
    
        var stringData = await response.Content.ReadAsStringAsync();
        var jsonData = JsonConvert.DeserializeObject<TOutput>(stringData);
    
        return Tuple.Create(HttpStatusCode.OK, jsonData);
    }
    

    上面的代码只是一个使用http客户端的快速演示,在现实世界中,你应该使用HttpClientFactory来代替。 HttpClientFactory有多种使用方式,你可以read here at Microsoft Docs

    直接使用 HttpClient 可能会导致 M$ 提到的一些问题“作为第一个问题,虽然这个类是一次性的,但在 using 语句中使用它并不是最好的选择,因为即使你在处理 HttpClient 对象时,底层套接字不会立即释放,可能会导致名为“套接字耗尽”的严重问题。”

    【讨论】:

      【解决方案2】:

      您可以使用以下代码 sn-p 发出 Put 请求。

       protected async Task<Tuple<Boolean, TOutput>> PutResult<TInput, TOutput>(String url, TOutput fallbackValue, TInput input)
       {
         HttpRequestMessage requestMessage = GetPutHttpRequestMessageWithSerializedContent(url, input);
         Tuple<Boolean, TOutput> result = await SendAsync(requestMessage, fallbackValue);
         return result;
       }
      
       private HttpRequestMessage GetPutHttpRequestMessageWithSerializedContent<TInput>(String url, TInput input)
          {
              String rawContent = JsonConvert.SerializeObject(input, JsonSerializerOptions);
      
              StringContent content = new StringContent(rawContent, Encoding.UTF8, "application/json");
              HttpRequestMessage requestMessage = new HttpRequestMessage(HttpMethod.Put, url)
              {
                  Content = content
              };
      
              return requestMessage;
          }
      

      【讨论】:

        猜你喜欢
        • 2021-01-04
        • 2020-05-28
        • 1970-01-01
        • 2019-11-19
        • 2019-06-14
        • 1970-01-01
        • 2021-09-02
        • 2020-06-21
        • 2019-11-05
        相关资源
        最近更新 更多