Question Communication Error because in Faulted state

Dhruvil

Member
Joined
Dec 19, 2020
Messages
12
Programming Experience
3-5
I am getting this error when I run my C# wrapper from Power Automate. But this error is returned only sometimes. On resubmitting my power automate flow, the code works as required.

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()"
}

This temporary error is disrupting long processes sometimes and has to be resubmitted.
My code for C# controller is :

//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";
    }
}

My guess is this error has started popping after I added this line : client.InnerChannel.OperationTimeout = new TimeSpan(0, 10, 00);
Since, the request was getting expired in 1 min, adding this line was necessary.

Can you please tell why am I getting that communication error sometimes ?
 
Do you get the error only when you call async or does it happen regardless of calling sync or async?
 
It happens regardless of async or sync is called. It wasn't happening before I added 1. timeout and 2. Async

Also, this error is not caught in my exception block even in case of sync
 
Last edited by a moderator:
I tried client.Open and client.close for this and removed my async method. But now I am receiving this error. It is also temporary and happens only the 1st time. As I resubmit my power automate flow, the error is resolved. Is it due to some timeout? This error happens every first time in a while.

JSON:
{
  "className": "xxx",
  "methodName": "xxx",
  "status": "Error",
  "userName": "xxx",
  "aifURL": "xxx",
  "data": null,
  "error": {
    "ClassName": "System.ServiceModel.CommunicationException",
    "Message": "The socket connection was aborted. This could be caused by an error processing your message or a receive timeout being exceeded by the remote host, or an underlying network resource issue. Local socket timeout was '00:09:59.9843888'.",
    "Data": {},
    "InnerException": {
      "ClassName": "System.IO.IOException",
      "Message": "The read operation failed, see inner exception.",
      "Data": {},
      "InnerException": {
        "ClassName": "System.ServiceModel.CommunicationException",
        "Message": "The socket connection was aborted. This could be caused by an error processing your message or a receive timeout being exceeded by the remote host, or an underlying network resource issue. Local socket timeout was '00:09:59.9843888'.",
        "Data": {},
        "InnerException": {
          "NativeErrorCode": 10054,
          "ClassName": "System.Net.Sockets.SocketException",
          "Message": "An existing connection was forcibly closed by the remote host",
          "Data": {},
          "InnerException": null,
          "HelpURL": null,
          "StackTraceString": "   at System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags)\r\n   at System.ServiceModel.Channels.SocketConnection.ReadCore(Byte[] buffer, Int32 offset, Int32 size, TimeSpan timeout, Boolean closing)",
          "RemoteStackTraceString": null,
          "RemoteStackIndex": 0,
          "ExceptionMethod": "8\nReceive\nSystem, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\nSystem.Net.Sockets.Socket\nInt32 Receive(Byte[], Int32, Int32, System.Net.Sockets.SocketFlags)",
          "HResult": -2147467259,
          "Source": "System",
          "WatsonBuckets": null
        },
        "HelpURL": null,
        "StackTraceString": "   at System.ServiceModel.Channels.SocketConnection.ReadCore(Byte[] buffer, Int32 offset, Int32 size, TimeSpan timeout, Boolean closing)\r\n   at System.ServiceModel.Channels.SocketConnection.Read(Byte[] buffer, Int32 offset, Int32 size, TimeSpan timeout)\r\n   at System.ServiceModel.Channels.ConnectionStream.Read(Byte[] buffer, Int32 offset, Int32 count)\r\n   at System.Net.FixedSizeReader.ReadPacket(Byte[] buffer, Int32 offset, Int32 count)\r\n   at System.Net.Security.NegotiateStream.StartFrameHeader(Byte[] buffer, Int32 offset, Int32 count, AsyncProtocolRequest asyncRequest)\r\n   at System.Net.Security.NegotiateStream.StartReading(Byte[] buffer, Int32 offset, Int32 count, AsyncProtocolRequest asyncRequest)\r\n   at System.Net.Security.NegotiateStream.ProcessRead(Byte[] buffer, Int32 offset, Int32 count, AsyncProtocolRequest asyncRequest)",
        "RemoteStackTraceString": null,
        "RemoteStackIndex": 0,
        "ExceptionMethod": "8\nReadCore\nSystem.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\nSystem.ServiceModel.Channels.SocketConnection\nInt32 ReadCore(Byte[], Int32, Int32, System.TimeSpan, Boolean)",
        "HResult": -2146233087,
        "Source": "System.ServiceModel",
        "WatsonBuckets": null
      },
      "HelpURL": null,
      "StackTraceString": "   at System.Net.Security.NegotiateStream.ProcessRead(Byte[] buffer, Int32 offset, Int32 count, AsyncProtocolRequest asyncRequest)\r\n   at System.Net.Security.NegotiateStream.Read(Byte[] buffer, Int32 offset, Int32 count)\r\n   at System.ServiceModel.Channels.StreamConnection.Read(Byte[] buffer, Int32 offset, Int32 size, TimeSpan timeout)",
      "RemoteStackTraceString": null,
      "RemoteStackIndex": 0,
      "ExceptionMethod": "8\nProcessRead\nSystem, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\nSystem.Net.Security.NegotiateStream\nInt32 ProcessRead(Byte[], Int32, Int32, System.Net.AsyncProtocolRequest)",
      "HResult": -2146232800,
      "Source": "System",
      "WatsonBuckets": null
    },
    "HelpURL": null,
    "StackTraceString": "   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 SXA_FlowIntegrationWebAPI.AX2012.SXAFlowIntegrationService.callMethod(SXAFlowIntegrationServiceCallMethodRequest request)\r\n   at SXA_FlowIntegrationWebAPI.AX2012.SXAFlowIntegrationServiceClient.callMethod(CallContext CallContext, String _className, String _methodName, String _data)\r\n   at SXA_FlowIntegrationWebAPI.Controllers.MainController.CallMethod(ClassMethodCallRequest request)",
    "RemoteStackTraceString": "\r\nServer stack trace: \r\n   at System.ServiceModel.Channels.StreamConnection.Read(Byte[] buffer, Int32 offset, Int32 size, TimeSpan timeout)\r\n   at System.ServiceModel.Channels.ClientFramingDuplexSessionChannel.SendPreamble(IConnection connection, ArraySegment`1 preamble, TimeoutHelper& timeoutHelper)\r\n   at System.ServiceModel.Channels.ClientFramingDuplexSessionChannel.DuplexConnectionPoolHelper.AcceptPooledConnection(IConnection connection, TimeoutHelper& timeoutHelper)\r\n   at System.ServiceModel.Channels.ConnectionPoolHelper.EstablishConnection(TimeSpan timeout)\r\n   at System.ServiceModel.Channels.ClientFramingDuplexSessionChannel.OnOpen(TimeSpan timeout)\r\n   at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)\r\n   at System.ServiceModel.Channels.ServiceChannel.OnOpen(TimeSpan timeout)\r\n   at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)\r\n   at System.ServiceModel.Channels.ServiceChannel.CallOnceManager.CallOnce(TimeSpan timeout, CallOnceManager cascade)\r\n   at System.ServiceModel.Channels.ServiceChannel.EnsureOpened(TimeSpan timeout)\r\n   at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)\r\n   at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)\r\n   at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)\r\n\r\nException rethrown at [0]: \r\n",
    "RemoteStackIndex": 1,
    "ExceptionMethod": "8\nHandleReturnMessage\nmscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\nSystem.Runtime.Remoting.Proxies.RealProxy\nVoid HandleReturnMessage(System.Runtime.Remoting.Messaging.IMessage, System.Runtime.Remoting.Messaging.IMessage)",
    "HResult": -2146233087,
    "Source": "mscorlib",
    "WatsonBuckets": null
  }
}
 
Is it due to some timeout?
Yes. Read the error message (I've line wrapped it for you because apparently you didn't scroll to the right far enough):
C#:
"Message": "The socket connection was aborted.
This could be caused by an error processing your message
or a receive timeout being exceeded by the remote host,
or an underlying network resource issue.
Local socket timeout was '00:09:59.9843888'.",

I tried client.Open and client.close for this and removed my async method.
Show us your new code.
 
This is the new code
C#:
public class MainController : ApiController
    {
        [ActionName("Method")]
        [HttpPost]
        [Authorize]
        public IHttpActionResult CallMethod(ClassMethodCallRequest request)
        {
            dynamic retValue;
            bool success = false;
            AX2012.SXAFlowIntegrationServiceClient client = null;       

            try
            {
                client = new AX2012.SXAFlowIntegrationServiceClient();

                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);

                retValue = client.callMethod(callContext, request.className, request.methodName, request.dataJsonStr);
                client.Close();
                success = true;

            }
            catch (Exception e)
            {
                return Json(new ClassMethodCallResponse
                {
                    status = "Error",
                    userName = User.Identity.Name,
                    className = request.className,
                    methodName = request.methodName,
                    aifURL = request.aifURL,
                    error = e
                });
            }
            finally
            {
                if (!success)
                {
                    client.Abort();
                }
            }
            
            return Json(new ClassMethodCallResponse
            {
                status = "Success",
                userName = User.Identity.Name,
                className = request.className,
                methodName = request.methodName,
                aifURL = request.aifURL,
                data = retValue,
            });
        }

    }
 
Back
Top Bottom