C# 包装异步方法不执行 AX 2012 方法但同步工作
C# wrapper Async method not executing AX 2012 method but sync is working
我正在尝试使用 C# 包装器异步调用我的 AX 2012 方法,但 AX 2012 方法未执行。同步调用正确处理了相同的数据并正确执行。下面是 C# 中控制器的代码。为什么它不执行异步方法?
我试过不等待和等待调用它。我试过调试,但由于线程不同,它可能无法正常工作。
同步部分工作正常,但调用它的 MS Flow API 由于 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";
}
}
}
controller方法需要是async Task<IHttpActionResult>
return类型,那么在controller方法中也需要等待调用
我发现通过使用 'using' 关键字,该对象在我的异步函数执行完成之前就被处理掉了。我在我的异步函数中使用了 client.Open() 和 client.Close() 并且它进入了 AX 2012 方法。
虽然,我没有解决我的问题,但至少我能够访问该方法。
我有一个问题,异步不是 运行 异步方式,我已经在 C# 论坛中为此打开了我的线程。
https://csharpforums.net/threads/async-c-code-not-executing-in-async-manner.6281/
我正在尝试使用 C# 包装器异步调用我的 AX 2012 方法,但 AX 2012 方法未执行。同步调用正确处理了相同的数据并正确执行。下面是 C# 中控制器的代码。为什么它不执行异步方法?
我试过不等待和等待调用它。我试过调试,但由于线程不同,它可能无法正常工作。
同步部分工作正常,但调用它的 MS Flow API 由于 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";
}
}
}
controller方法需要是async Task<IHttpActionResult>
return类型,那么在controller方法中也需要等待调用
我发现通过使用 'using' 关键字,该对象在我的异步函数执行完成之前就被处理掉了。我在我的异步函数中使用了 client.Open() 和 client.Close() 并且它进入了 AX 2012 方法。
虽然,我没有解决我的问题,但至少我能够访问该方法。 我有一个问题,异步不是 运行 异步方式,我已经在 C# 论坛中为此打开了我的线程。
https://csharpforums.net/threads/async-c-code-not-executing-in-async-manner.6281/