德鲁维尔
成员
- 已加入
- 2020年12月19日
- 留言内容
- 12
- 编程经验
- 3-5
从Power Automate运行C#包装程序时,出现此错误。但是此错误仅在某些时候返回。重新提交我的电源自动化流程后,代码将按要求工作。
此临时错误有时会干扰较长的流程,因此必须重新提交。
我的C#控制器代码是:
我的猜测是,在添加以下行后,此错误已开始弹出: client.InnerChannel.OperationTimeout = new TimeSpan(0,10,00);
由于请求在1分钟内过期,因此必须添加此行。
您能告诉我为什么有时会出现该通信错误吗?
C#:
{
"Message": "An error has occurred.\r\nclientRequestId: 66b3b4af-edc0-4bbb-b6e2-11e217c00480",
"ExceptionMessage": "The communication object, System.ServiceModel.Channels.ServiceChannel, cannot be used for communication because it is in the Faulted state.",
"ExceptionType": "System.ServiceModel.CommunicationObjectFaultedException",
"StackTrace": "\r\nServer stack trace: \r\n at System.ServiceModel.Channels.CommunicationObject.Close(TimeSpan timeout)\r\n\r\nException rethrown at [0]: \r\n at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)\r\n at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)\r\n at System.ServiceModel.ICommunicationObject.Close(TimeSpan timeout)\r\n at System.ServiceModel.ClientBase`1.System.ServiceModel.ICommunicationObject.Close(TimeSpan timeout)\r\n at SXA_FlowIntegrationWebAPI.Controllers.MainController.CallMethod(ClassMethodCallRequest request)\r\n at lambda_method(Closure , Object , Object[] )\r\n at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass10.<GetExecutor>b__9(Object instance, Object[] methodParameters)\r\n at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext, IDictionary`2 arguments, CancellationToken cancellationToken)\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()\r\n at System.Web.Http.Controllers.ApiControllerActionInvoker.<InvokeActionAsyncCore>d__0.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()\r\n at System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__2.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Web.Http.Filters.AuthorizationFilterAttribute.<ExecuteAuthorizationFilterAsyncCore>d__2.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()\r\n at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()"
}
此临时错误有时会干扰较长的流程,因此必须重新提交。
我的C#控制器代码是:
//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 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"; } }:
//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";
}
}
我的猜测是,在添加以下行后,此错误已开始弹出: client.InnerChannel.OperationTimeout = new TimeSpan(0,10,00);
由于请求在1分钟内过期,因此必须添加此行。
您能告诉我为什么有时会出现该通信错误吗?