gpt4 book ai didi

azure - 单例 httpClient 到 AppService 的单个实例

转载 作者:行者123 更新时间:2023-12-03 03:51:59 25 4
gpt4 key购买 nike

首先,我为我糟糕的英语感到抱歉:'(。

我正在开发一个客户端,用于将 POST 消息发送到 Azure AppService 中托管的 WebAPI。我读到最佳实践是使用单例模式,所以我就这样开发了。

公共(public)静态类UtilHTTP{

    private static readonly ConcurrentDictionary<string, HttpClient> dicClient = new ConcurrentDictionary<string, HttpClient>();

public static string PostSingleton(string url, string contentType, string accept, string rq, Dictionary<string, string> headers)
{
Task<string> response = Fetch(url, contentType, accept, rq, headers);
response.Wait();
return response.Result;
}

private static HttpClient GetdicClient(string url, string contentType, string accept)
{
string key = string.Format("{0}#{1}#{2}", url, contentType, accept);
if (!dicClient.ContainsKey(key))
{
dicClient.GetOrAdd(key, new HttpClient());

if (!string.IsNullOrEmpty(accept))
{
dicClient[key].DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue(accept));
}
}
return dicClient[key];
}

private static async Task<string> Fetch(string url, string contentType, string accept, string rq, Dictionary<string, string> headers)
{
//_http.Timeout = new TimeSpan(0,0,6);
HttpContent content;
if (string.IsNullOrEmpty(contentType))
{
content = new StringContent(rq, Encoding.UTF8);
}
else
{
content = new StringContent(rq, Encoding.UTF8, contentType);
}

if (headers != null)
{
foreach (KeyValuePair<string, string> h in headers)
{
content.Headers.Add(h.Key, h.Value);
}
}

HttpResponseMessage response = await GetdicClient(url, contentType, accept).PostAsync(url, content);
string resultContent = await response.Content.ReadAsStringAsync();

if (!response.IsSuccessStatusCode)
{
resultContent = response.ReasonPhrase;
}

return resultContent;
}

}

我在 AppService 中有两个服务实例,但所有请求都发送到同一个实例,因此我无法扩展服务并且性能也不是很好。

Insights Performance

代码有问题吗?您认为是服务器端的问题吗?我必须使用其他模式吗?

非常感谢!

最佳答案

乍一看,您似乎正确地执行了单例 HttpClient (每个客户端)。我能看到的唯一问题是,如果您多次调用同一 URL,并且 URL 中包含不同的参数,这些参数将导致创建一个新客户端。不过,我不知道您正在这样做,所以这里可能没有问题。

您讨论的另一个问题(关于前往应用服务的同一实例的所有请求)可能与 ARR 关联性(所谓的“粘性 session ”)有关。检查您的应用服务设置(配置 -> 常规设置)确保它已关闭:

ARR Affinity

关于azure - 单例 httpClient 到 AppService 的单个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66316328/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com