Я пытаюсь вызвать асинхронный метод AX 2012 с помощью оболочки С#, но метод AX 2012 не выполняется. Те же данные правильно обрабатываются вызовом синхронизации и выполняются правильно. Ниже приведен код контроллера на C#. Почему не выполняется асинхронный метод?
Я пытался вызвать его без ожидания, а также ожидания. Я пробовал отлаживать, но, вероятно, это не сработает из-за другого потока.
Часть синхронизации работает правильно, но время ожидания вызова этого API MS Flow истекает из-за ограничений в Flow.
Подскажите, пожалуйста, как заставить работать асинхронность? Могу ли я сделать это асинхронным в AX 2012?
//It dynamically sets the AIF Url and calls the method to consume AIF services
using SXA_FlowIntegrationWebAPI.Helpers;
using SXA_FlowIntegrationWebAPI.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
namespace SXA_FlowIntegrationWebAPI.Controllers
{
public class MainController : ApiController
{
[ActionName("Method")]
[HttpPost]
[Authorize]
public IHttpActionResult CallMethod(ClassMethodCallRequest request)
{
dynamic retValue;
using (var client = new AX2012.SXAFlowIntegrationServiceClient())
{
try
{
var callContext = new AX2012.CallContext();
callContext.Company = request.companyId;
callContext.LogonAsUser = User.Identity.Name;
client.InnerChannel.OperationTimeout = new TimeSpan(0, 10, 00);
client.Endpoint.Address = new System.ServiceModel.EndpointAddress(request.aifURL);
if (request.methodName == "async")
{
retValue = "";
//client.callMethodAsync(callContext, request.className, request.methodName, request.dataJsonStr);
CallMethodAsyncCustom(client, callContext, request);
}
else
{
retValue = client.callMethod(callContext, request.className, request.methodName, request.dataJsonStr);
}
}
catch(Exception e)
{
return Json(new ClassMethodCallResponse
{
status = "Error",
userName = User.Identity.Name,
className = request.className,
methodName = request.methodName,
aifURL = request.aifURL,
error = e
});
}
}
return Json(new ClassMethodCallResponse
{
status = "Success",
userName = User.Identity.Name,
className = request.className,
methodName = request.methodName,
aifURL = request.aifURL,
data = retValue,
});
}
public static async System.Threading.Tasks.Task<string> CallMethodAsyncCustom(AX2012.SXAFlowIntegrationServiceClient client, AX2012.CallContext callContext, ClassMethodCallRequest request)
{
await System.Threading.Tasks.Task.Run(() => client.callMethodAsync(callContext, request.className, request.methodName, request.dataJsonStr));
return "Completed";
}
}
}
я выполнил инкрементный
Метод контроллера должен быть возвращаемого типа async Task<IHttpActionResult>
, тогда вам также нужно дождаться вызова в методе контроллера.
Я попытался использовать это, но мой MS Flow завершился с ошибкой «Не удалось войти в Microsoft Dynamics AX». Более того, я хочу, чтобы он был асинхронным для определенного условия. Не весь метод
Методы помечаются как асинхронные во время компиляции. Если вам нужен не асинхронный метод, вам нужно создать другой метод контроллера.
Я понял, что с помощью ключевого слова «using» объект удаляется до завершения выполнения моей асинхронной функции. Я использовал client.Open() и client.Close() в своей асинхронной функции, и она перешла в метод AX 2012.
Хотя я не решил свою проблему, по крайней мере, я смог получить доступ к методу. У меня проблема с тем, что асинхронность не работает асиммически, и я открыл для этого свою тему на форуме С#.
https://csharpforums.net/threads/async-c-code-not-executing-in-async-manner.6281/
Просто чтобы исключить очевидное, вы выполняли инкрементную или заполняющую
CIL
компиляцию в AX?