09.10.2021, 18:04 | #1 |
Участник
|
Как извлечь HttpResponseMessage из результата HttpClient.PostAsync (System.Threading.Tasks.Task )
Всем доброго времени суток.
Пытаюсь перенести в Ах .Net пример вот отсюда https://www.remove.bg/api#sample-code Имею следующий код X++: System.Net.Http.MultipartFormDataContent multipartFormDataContent; System.Net.Http.Headers.HttpContentHeaders httpContentHeaders; System.Net.Http.HttpClient httpClient; System.Net.Http.HttpResponseMessage httpResponseMessage; System.Net.Http.HttpContent httpContent; System.Net.Http.ByteArrayContent byteArrayContent; System.Net.Http.StringContent stringContent; System.Threading.Tasks.Task task; System.Byte[] fileByte; System.IO.FileStream fileStream; ; .... httpClient = new System.Net.Http.HttpClient (); multipartFormDataContent = new System.Net.Http.MultipartFormDataContent(); httpContentHeaders = multipartFormDataContent.get_Headers(); httpContentHeaders.Add('X-Api-Key', SysAdminParameters::removeBgApiKey()); fileByte = System.IO.File::ReadAllBytes(fileName); byteArrayContent = new System.Net.Http.ByteArrayContent(fileByte); multipartFormDataContent.Add(byteArrayContent, 'image_file', fileName); stringContent = new System.Net.Http.StringContent('auto'); multipartFormDataContent.Add(stringContent, 'size'); try { task = httpClient.PostAsync("https://api.remove.bg/v1.0/removebg", multipartFormDataContent); // вот тут собственно у меня и затык //httpResponseMessage = httpClient.PostAsync("https://api.remove.bg/v1.0/removebg", multipartFormDataContent); if (isSuccessStatusCode) { fileStream = new System.IO.FileStream(fileNameWoBg, System.IO.FileMode::Create, System.IO.FileAccess::Write, System.IO.FileShare::None); httpContent = httpResponseMessage.get_Content(); httpContent.CopyToAsync(fileStream); fileStream.Close(); } } catch (Exception::CLRError) { //info(AifUtil::getClrErrorMessage()); handleClrException_MRC(false, true); throw error("@SYS93289"); } Подсказка явно показывает что результат работы httpClient.PostAsync это System.Threading.Tasks.Task`1[System.Net.Http.HttpResponseMessage] |
|
09.10.2021, 18:10 | #2 |
Участник
|
А в X++ разве можно вообще асинхронно что-то делать?
|
|
09.10.2021, 18:20 | #3 |
Участник
|
Похоже нельзя. Думал вдруг что-то изменилось. Годы идут.
А тут в этом плане похоже стабильность) |
|
09.10.2021, 18:32 | #4 |
Участник
|
|
|
09.10.2021, 19:21 | #5 |
Участник
|
|
|
09.10.2021, 19:33 | #6 |
Участник
|
Это свойство. По идее должно быть get_Result
|
|
09.10.2021, 19:44 | #7 |
Участник
|
|
|
09.10.2021, 19:57 | #8 |
Участник
|
При вызове асинков из смешанного кода можно получить дедлок https://medium.com/rubrikkgroup/unde...s-e41f8f2c6f5d
Я бы поискал синхронное api |
|
|
За это сообщение автора поблагодарили: Logger (3), S.Kuskov (5). |
09.10.2021, 20:08 | #9 |
Участник
|
У task нет Result, потому что у вас task это System.Threading.Tasks.Task
https://docs.microsoft.com/ru-ru/dot...k?view=net-5.0 А Result есть у Task<TResult> https://docs.microsoft.com/ru-ru/dot...t?view=net-5.0 |
|
|
За это сообщение автора поблагодарили: S.Kuskov (2). |
09.10.2021, 20:32 | #10 |
Участник
|
Если всё ещё не передумали продолжать, то
пример работы с Generic типами при помощи reflection |
|
09.10.2021, 20:49 | #12 |
Участник
|
Еще есть метод для их вызова
\Classes\OXML_RU\invokeGeneric |
|
|
За это сообщение автора поблагодарили: trud (2), S.Kuskov (2). |
10.10.2021, 00:33 | #13 |
Участник
|
|
|
14.10.2021, 19:48 | #14 |
Участник
|
.GetAwaiter().GetResult() вроде предпочтительнее
Последний раз редактировалось lvan; 14.10.2021 в 19:57. |
|
|
За это сообщение автора поблагодарили: trud (2). |
15.10.2021, 14:05 | #15 |
Участник
|
Цитата:
https://vmoskalenkoblog.wordpress.co...p-from-x-code/ X++: using System.Net; using System.Net.Http; /// <summary> /// How to call Microsoft Flow / Logic App from X++ code /// </summary> class CiePOSTmsFlow { private HttpRequestMessage request; private System.Net.Http.HttpClient httpClient; private str requestContent; /// <summary> /// main method /// </summary> /// <param name = "_args"></param> public static void main(Args _args) { CiePOSTmsFlow postClass = new CiePOSTmsFlow(); postClass.makePOST(); } /// <summary> /// Make a POST call to specified URL /// </summary> public void makePOST() { System.Net.Http.HttpResponseMessage response; const str URL = 'https://prod-38.westus.logic.azure.com:443/workflows/92375d07a20f49f0af0c6ef5ecdcd0dc/triggers/manual/paths/invoke?api-version=2016-06-01&sp=%2Ftriggers%2Fmanual%2Frun&sv=1.0&sig=xUL92bTtRiS4bGK0BEscSmpZoryU8UOxL52uNQR_bto'; //Microsoft Flow / Logic App endpoint try { requestContent = '{"name" : "JSON parameter1", "description" : "Test JSON" }'; //test JSON this.ConfigureHttpClient(URL); if(request != null) { response = httpClient.SendAsync(request).Result; if(!response.IsSuccessStatusCode) { Info("MS Flow response is not successful. Please find details below."); warning(strFmt(response.Content.ReadAsStringAsync().Result)); } else { Info("MS Flow has been called successful"); Info(strFmt(response.Content.ReadAsStringAsync().Result)); } } } catch { warning("Error in calling MS Flow"); } } /// <summary> /// Configure HTTP Client /// </summary> /// <param name = "_url">URL</param> private void ConfigureHttpClient(str _url = '') { System.Net.ServicePointManager::set_SecurityProtocol(System.Net.SecurityProtocolType::Tls12); httpClient = new System.Net.Http.HttpClient(); if(!_url) { warning("No URL Provided"); } else { httpClient.BaseAddress = new System.Uri(_url); System.Net.Http.Headers.HttpHeaders requestHeaders = httpClient.DefaultRequestHeaders; request = new HttpRequestMessage(HttpMethod::Post, httpClient.BaseAddress); if(requestContent) { request.Content = new StringContent(requestContent); requestHeaders = request.Content.Headers; requestHeaders.Remove("Content-Type"); //https://www.json.org/index.html //A string is a sequence of zero or more Unicode characters, wrapped in double quotes, using backslash escapes. A character is represented as a single character string. //The application/json entry in the IANA registry has a note: //Note: No "charset" parameter is defined for this registration. //Adding one really has no effect on compliant recipients. requestHeaders.Add("Content-Type", "application/json"); //requestHeaders.Add("Ocp-Apim-Subscription-Key", sKey); requestContent = ""; } } } } |
|
|
За это сообщение автора поблагодарили: Vadik (1), raz (5). |
Теги |
.net, ax2012, generic, httpclient, httpresponsemessage, task |
|
|