.Net Core 2.2,PutAsync,HttpContent问题

时间:2019-05-28 00:52:46

标签: .net-core-2.2

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

创建它

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

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

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

2 个答案:

答案 0 :(得分:0)

请参考以下代码片段进行发布请求,您可以同时实现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对象,底层套接字不会立即释放,并且可能导致严重的问题,称为“套接字耗尽”。

答案 1 :(得分:0)

您可以使用以下代码段发出“放置”请求。

 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;
    }