我正在从具有express的节点过渡到.Net Core 2.2。我正在尝试创建放置请求以将更新推送到api。我发现我可以用
创建它 var client = new HttpClient();
client.PutAsync(url, httpContent)
我的第一个问题是,如何创建httpContent?通常在这种情况下,我会创建一个JSON对象,但是当然在这里不起作用。
我的第二个问题是,我正在使用.Net Core 2.2。是使用HttpClient的正确方法还是应该使用Factory?
答案 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;
}