AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
DAX
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 09.10.2021, 18:04   #1  
smailik is offline
smailik
Участник
Аватар для smailik
 
250 / 70 (3) ++++
Регистрация: 10.04.2012
Адрес: Москва
Как извлечь 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");
}
Как из Task извлечь HttpResponseMessage?
Подсказка явно показывает что результат работы httpClient.PostAsync это System.Threading.Tasks.Task`1[System.Net.Http.HttpResponseMessage]
Старый 09.10.2021, 18:10   #2  
Pandasama is offline
Pandasama
Участник
 
448 / 133 (5) +++++
Регистрация: 11.08.2014
Адрес: Барнаул
А в X++ разве можно вообще асинхронно что-то делать?
Старый 09.10.2021, 18:20   #3  
smailik is offline
smailik
Участник
Аватар для smailik
 
250 / 70 (3) ++++
Регистрация: 10.04.2012
Адрес: Москва
Похоже нельзя. Думал вдруг что-то изменилось. Годы идут.
А тут в этом плане похоже стабильность)
Старый 09.10.2021, 18:32   #4  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,427 / 1771 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Calling async method from X++
Старый 09.10.2021, 19:21   #5  
smailik is offline
smailik
Участник
Аватар для smailik
 
250 / 70 (3) ++++
Регистрация: 10.04.2012
Адрес: Москва
Я натыкался на эту ссылку. И много других видел про Task.Result, вот только мне система говорит что нет такого метода
Старый 09.10.2021, 19:33   #6  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,427 / 1771 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Это свойство. По идее должно быть get_Result
Старый 09.10.2021, 19:44   #7  
smailik is offline
smailik
Участник
Аватар для smailik
 
250 / 70 (3) ++++
Регистрация: 10.04.2012
Адрес: Москва
Искал. Почему-то нету.

Когда поиски не увенчались успехом, то пошел сюда у людей совета искать.
Старый 09.10.2021, 19:57   #8  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2922 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
При вызове асинков из смешанного кода можно получить дедлок https://medium.com/rubrikkgroup/unde...s-e41f8f2c6f5d

Я бы поискал синхронное api
За это сообщение автора поблагодарили: Logger (3), S.Kuskov (5).
Старый 09.10.2021, 20:08   #9  
Pandasama is offline
Pandasama
Участник
 
448 / 133 (5) +++++
Регистрация: 11.08.2014
Адрес: Барнаул
У 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  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,427 / 1771 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Если всё ещё не передумали продолжать, то
пример работы с Generic типами при помощи reflection
Старый 09.10.2021, 20:45   #11  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,427 / 1771 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от belugin Посмотреть сообщение
Я бы поискал синхронное api
https://stackoverflow.com/a/66655958
Старый 09.10.2021, 20:49   #12  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,867 / 3123 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Еще есть метод для их вызова
\Classes\OXML_RU\invokeGeneric
За это сообщение автора поблагодарили: trud (2), S.Kuskov (2).
Старый 10.10.2021, 00:33   #13  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2922 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
WebClient надо. .net 5 аксаптой не поддерживается
Старый 14.10.2021, 19:48   #14  
lvan is offline
lvan
Участник
Аватар для lvan
Лучший по профессии 2014
 
856 / 82 (4) ++++
Регистрация: 15.04.2011
Записей в блоге: 1
.GetAwaiter().GetResult() вроде предпочтительнее

Последний раз редактировалось lvan; 14.10.2021 в 19:57.
За это сообщение автора поблагодарили: trud (2).
Старый 15.10.2021, 14:05   #15  
vmoskalenko is offline
vmoskalenko
Участник
Аватар для vmoskalenko
 
145 / 334 (12) ++++++
Регистрация: 25.01.2007
Адрес: Toronto
Цитата:
Сообщение от smailik Посмотреть сообщение
Как из Task извлечь HttpResponseMessage?
Подсказка явно показывает что результат работы httpClient.PostAsync это System.Threading.Tasks.Task`1[System.Net.Http.HttpResponseMessage]
Вот тут я привожу пример кода для вызова Logic App / PowerAutomate Flow из D365FO через HTTP запрос.
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

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
kurthatlevik: Batch Jobs; Take control of the executions Blog bot DAX Blogs 0 20.01.2020 20:13
stoneridgesoftware: Working with Task Recorder and Task Guide in New Microsoft Dynamics AX Blog bot DAX Blogs 0 27.05.2016 00:16
Trace Parser. Error: Incorrect or missing MOF file, import is not available. Poleax DAX: Администрирование 6 13.05.2011 10:43
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 01:34.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.