/// <summary> /// Sends response to the remote application that invoked a service method. /// </summary> /// <param name="requestMessage">Request message</param> /// <param name="returnValue">Return value to send</param> /// <param name="exception">Exception to send</param> private void SendInvokeResponse(IScsMessage requestMessage, object returnValue, ScsRemoteException exception) { try { _requestReplyMessenger.SendMessage( new ScsRemoteInvokeReturnMessage { RepliedMessageId = requestMessage.MessageId, ReturnValue = returnValue, RemoteException = exception }); } catch { } }
/// <summary> /// Sends response to the remote application that invoked a service method. /// </summary> /// <param name="requestMessage">Request message</param> /// <param name="returnValue">Return value to send</param> /// <param name="exception">Exception to send</param> private void SendInvokeResponse(IScsMessage requestMessage, object returnValue, ScsRemoteException exception) { try { _requestReplyMessenger.SendMessage( new ScsRemoteInvokeReturnMessage { RepliedMessageId = requestMessage.MessageId, ReturnValue = returnValue, RemoteException = exception }); } catch (Exception ex) { System.Diagnostics.Trace.Write($"SendInvokeResponse: {ex}"); } }
/// <summary> /// Sends response to the remote application that invoked a service method. /// </summary> /// <param name="client">Client that sent invoke message</param> /// <param name="requestMessage">Request message</param> /// <param name="returnValue">Return value to send</param> /// <param name="exception">Exception to send</param> /// <param name="parameters"> /// Parameters possibly modified in the method call by out or ref /// </param> private static void SendInvokeResponse(IMessenger client, IScsMessage requestMessage, object returnValue, ScsRemoteException exception, object[] parameters = null) { try { client.SendMessage(new ScsRemoteInvokeReturnMessage { RepliedMessageId = requestMessage.MessageId, ReturnValue = returnValue, RemoteException = exception, Parameters = parameters }, 10); } catch (Exception ex) { Logger.Error("Invoke response send failed", ex); } }
/// <summary> /// Sends response to the remote application that invoked a service method. /// /// </summary> /// <param name="client">Client that sent invoke message</param><param name="requestMessage">Request message</param><param name="returnValue">Return value to send</param><param name="exception">Exception to send</param> private static void SendInvokeResponse(IMessenger client, IScsMessage requestMessage, object returnValue, ScsRemoteException exception) { try { IMessenger messenger = client; ScsRemoteInvokeReturnMessage invokeReturnMessage1 = new ScsRemoteInvokeReturnMessage(); invokeReturnMessage1.RepliedMessageId = requestMessage.MessageId; invokeReturnMessage1.ReturnValue = returnValue; invokeReturnMessage1.RemoteException = exception; ScsRemoteInvokeReturnMessage invokeReturnMessage2 = invokeReturnMessage1; messenger.SendMessage((IScsMessage)invokeReturnMessage2); } catch { } }
/// <summary> /// Sends response to the remote application that invoked a service method. /// /// </summary> /// <param name="requestMessage">Request message</param><param name="returnValue">Return value to send</param><param name="exception">Exception to send</param> private void SendInvokeResponse(IScsMessage requestMessage, object returnValue, ScsRemoteException exception) { try { RequestReplyMessenger <IScsClient> requestReplyMessenger = this._requestReplyMessenger; ScsRemoteInvokeReturnMessage invokeReturnMessage1 = new ScsRemoteInvokeReturnMessage(); invokeReturnMessage1.RepliedMessageId = requestMessage.MessageId; invokeReturnMessage1.ReturnValue = returnValue; invokeReturnMessage1.RemoteException = exception; ScsRemoteInvokeReturnMessage invokeReturnMessage2 = invokeReturnMessage1; requestReplyMessenger.SendMessage((IScsMessage)invokeReturnMessage2); } catch { } }
/// <summary> /// Sends response to the remote application that invoked a service method. /// </summary> /// <param name="requestMessage">Request message</param> /// <param name="returnValue">Return value to send</param> /// <param name="exception">Exception to send</param> private void SendInvokeResponse(IScsMessage requestMessage, object returnValue, ScsRemoteException exception) { try { _requestReplyMessenger.SendMessage(new ScsRemoteInvokeReturnMessage { RepliedMessageId = requestMessage.MessageId, ReturnValue = returnValue, RemoteException = exception }); } catch (Exception ex) { _log.Error($"Exception:'{ex}',Message:'{ex.Message}',StackTrace:'{ex.StackTrace}'"); } }
/// <summary> /// Sends response to the remote application that invoked a service method. /// </summary> /// <param name="client">Client that sent invoke message</param> /// <param name="requestMessage">Request message</param> /// <param name="returnValue">Return value to send</param> /// <param name="exception">Exception to send</param> private static void SendInvokeResponse(IMessenger client, IScsMessage requestMessage, object returnValue, ScsRemoteException exception) { try { client.SendMessage( new ScsRemoteInvokeReturnMessage { RepliedMessageId = requestMessage.MessageId, ReturnValue = returnValue, RemoteException = exception }, 10); } catch { } }
/// <summary> /// Sends response to the remote application that invoked a service method. /// </summary> /// <param name="client">Client that sent invoke message</param> /// <param name="requestMessage">Request message</param> /// <param name="returnValue">Return value to send</param> /// <param name="exception">Exception to send</param> /// <param name="Parameters">Los parametros posiblemente modificados en la llamada al metodo mediante out o ref</param> private static void SendInvokeResponse(IMessenger client, IScsMessage requestMessage, object returnValue, ScsRemoteException exception, object[] Parameters = null) { try { client.SendMessage( new ScsRemoteInvokeReturnMessage { RepliedMessageId = requestMessage.MessageId, ReturnValue = returnValue, RemoteException = exception, //Se devuelven todos los parametros con su respectiva modificacion a fin de poder tener metodos con out y ref Parameters = Parameters }); } catch (Exception ex) { //Si por ejemplo se intenta enviar como respuesta un objeto no serializable, la aplicacion se cuelga y el cliente no obtiene ningun dato que permita saber el porque try { client.SendMessage( new ScsRemoteInvokeReturnMessage { RepliedMessageId = requestMessage.MessageId, RemoteException = new ScsRemoteException("SendInvokeResponse: " + ex.Message, ex), }); } catch { } } }
/// <summary> /// Handles MessageReceived events of all clients, evaluates each message, /// finds appropriate service object and invokes appropriate method. /// </summary> /// <param name="sender">Source of event</param> /// <param name="e">Event arguments</param> private void Client_MessageReceived(object sender, MessageEventArgs e) { //Get RequestReplyMessenger object (sender of event) to get client var requestReplyMessenger = (RequestReplyMessenger <IScsServerClient>)sender; //Cast message to ScsRemoteInvokeMessage and check it var invokeMessage = e.Message as ScsRemoteInvokeMessage; if (invokeMessage == null) { return; } try { //Get client object var client = _serviceClients[requestReplyMessenger.Messenger.ClientId]; if (client == null) { requestReplyMessenger.Messenger.Disconnect(); return; } //Get service object var serviceObject = _serviceObjects[invokeMessage.ServiceClassName]; if (serviceObject == null) { SendInvokeResponse(requestReplyMessenger, invokeMessage, null, new ScsRemoteException("There is no service with name '" + invokeMessage.ServiceClassName + "'")); return; } //Invoke method try { object returnValue; //Set client to service, so user service can get client //in service method using CurrentClient property. serviceObject.Service.CurrentClient = client; try { returnValue = serviceObject.InvokeMethod(invokeMessage.MethodName, invokeMessage.Parameters); } finally { //Set CurrentClient as null since method call completed serviceObject.Service.CurrentClient = null; } //Send method invocation return value to the client SendInvokeResponse(requestReplyMessenger, invokeMessage, returnValue, null, invokeMessage.Parameters); } catch (TargetInvocationException ex) { var innerEx = ex.InnerException; //Si el atributo de servicio del objeto es null, al momento de levantar la excepcion no se muestra el error real sino un Object Reference string detalle = serviceObject.ServiceAttribute != null ? (Environment.NewLine + "Service Version: " + serviceObject.ServiceAttribute.Version) : ""; var excepcion = new ScsRemoteException(innerEx.Message + detalle, innerEx); SendInvokeResponse(requestReplyMessenger, invokeMessage, null, excepcion); return; } catch (Exception ex) { SendInvokeResponse(requestReplyMessenger, invokeMessage, null, new ScsRemoteException(ex.Message + Environment.NewLine + "Service Version: " + serviceObject.ServiceAttribute.Version, ex)); return; } } catch (Exception ex) { SendInvokeResponse(requestReplyMessenger, invokeMessage, null, new ScsRemoteException("An error occured during remote service method call.", ex)); return; } }