Я пытаюсь создать синглтон для httpclientfactory в консольном приложении .Net 8 без использования расширения хостинга. Мне удалось заставить что-то работать, но я не уверен, что это является потокобезопасным, а также фактическим синглтоном во всем приложении.
Одна часть, которую мне не хватает, — это то, как Singleton работает между классами. Справляется ли DI с этим самостоятельно?
Смотрел на пример Microsoft в тексте, но не смог применить его к своим потребностям.
Кроме того, обратите внимание, что несколько запросы имеют файл cookie заголовка запроса по умолчанию, но не все из них.
Будет ли это работать как потокобезопасный синглтон httpclientfactory или будет создано несколько его экземпляров?
Program.cs:
using HttpClientFactoryConsole;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
IHttpClientFactory factory = new ServiceCollection()
.AddHttpClient()
.BuildServiceProvider()
.GetRequiredService\();
HttpClient hclient = factory.CreateClient();
//use hclient to get authorization cookie
string endpoint = "https://www.microsoft.com/login";
//string response = "";
HttpResponseMessage response = new HttpResponseMessage();
string cookie;
JObject joauth = new JObject()
{
{"userName","user"},
{"password","password"}
};
HttpContent content = new StringContent(joauth.ToString());
content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");
try
{
//HttpClient hclient = new HttpClient();
//httpContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");
response = await hclient.PostAsync(endpoint, content);
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
cookie = response.Headers.GetValues("Set-Cookie").First();
OtherClass ot = new OtherClass(factory);
JObject setup = await ot.PermitSetupAsync(cookie);
Другой класс:
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace HttpClientFactoryConsole
{
internal class OtherClass
{
private readonly IHttpClientFactory _httpClientFactory;
public OtherClass(IHttpClientFactory httpClientFactory) => _httpClientFactory = httpClientFactory;
public async Task PermitSetupAsync(string authcookie)
{
HttpClient hclient = _httpClientFactory.CreateClient();
JObject jSetup = new JObject();
string setupstring = "";
Stream setupstream;
string endpoint = "http://www.microsoft.com/setup";
//string response = "";
HttpResponseMessage response = new HttpResponseMessage();
try
{
hclient.DefaultRequestHeaders.Add("Cookie", authcookie); //first add of default header?
//httpContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");
response = await hclient.GetAsync(endpoint);
setupstream = await response.Content.ReadAsStreamAsync();
using (var streamReader = new StreamReader(setupstream))
{
setupstring = streamReader.ReadToEnd();
jSetup = (JObject)JsonConvert.DeserializeObject(setupstring);
}
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
return jSetup;
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/781 ... no-hosting
HttpClientFactory Singleton для всего приложения в консольном приложении без хостинга ⇐ C#
Место общения программистов C#
1710420042
Гость
Я пытаюсь создать синглтон для httpclientfactory в консольном приложении .Net 8 без использования расширения хостинга. Мне удалось заставить что-то работать, но я не уверен, что это является потокобезопасным, а также фактическим синглтоном во всем приложении.
Одна часть, которую мне не хватает, — это то, как Singleton работает между классами. Справляется ли DI с этим самостоятельно?
Смотрел на пример Microsoft в тексте, но не смог применить его к своим потребностям.
Кроме того, обратите внимание, что несколько запросы имеют файл cookie заголовка запроса по умолчанию, но не все из них.
Будет ли это работать как потокобезопасный синглтон httpclientfactory или будет создано несколько его экземпляров?
Program.cs:
using HttpClientFactoryConsole;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
IHttpClientFactory factory = new ServiceCollection()
.AddHttpClient()
.BuildServiceProvider()
.GetRequiredService\();
HttpClient hclient = factory.CreateClient();
//use hclient to get authorization cookie
string endpoint = "https://www.microsoft.com/login";
//string response = "";
HttpResponseMessage response = new HttpResponseMessage();
string cookie;
JObject joauth = new JObject()
{
{"userName","user"},
{"password","password"}
};
HttpContent content = new StringContent(joauth.ToString());
content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");
try
{
//HttpClient hclient = new HttpClient();
//httpContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");
response = await hclient.PostAsync(endpoint, content);
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
cookie = response.Headers.GetValues("Set-Cookie").First();
OtherClass ot = new OtherClass(factory);
JObject setup = await ot.PermitSetupAsync(cookie);
Другой класс:
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace HttpClientFactoryConsole
{
internal class OtherClass
{
private readonly IHttpClientFactory _httpClientFactory;
public OtherClass(IHttpClientFactory httpClientFactory) => _httpClientFactory = httpClientFactory;
public async Task PermitSetupAsync(string authcookie)
{
HttpClient hclient = _httpClientFactory.CreateClient();
JObject jSetup = new JObject();
string setupstring = "";
Stream setupstream;
string endpoint = "http://www.microsoft.com/setup";
//string response = "";
HttpResponseMessage response = new HttpResponseMessage();
try
{
hclient.DefaultRequestHeaders.Add("Cookie", authcookie); //first add of default header?
//httpContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");
response = await hclient.GetAsync(endpoint);
setupstream = await response.Content.ReadAsStreamAsync();
using (var streamReader = new StreamReader(setupstream))
{
setupstring = streamReader.ReadToEnd();
jSetup = (JObject)JsonConvert.DeserializeObject(setupstring);
}
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
return jSetup;
}
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/78160584/httpclientfactory-singleton-across-application-in-a-console-app-no-hosting[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия