private async Task <object> ProcessMessage(object client, ZimbraMessage zimbraMessage) { try { string name = zimbraMessage.GetType().Name; MethodInfo methodInfo = client.GetType().GetMethod(name); object[] parameters = new object[] { zimbraMessage }; object response = await Task.Run(async() => methodInfo.Invoke(client, parameters)); //System.Func<object,object[]> delegate = methodInfo.Invoke; //delegate.BeginInvoke(client, new object[] { zimbraMessage }); //Func<ZimbraAdminSoapClient, ZimbraMessage[], ZimbraMessage> messageDelegate = (Func<ZimbraAdminSoapClient, ZimbraMessage[], ZimbraMessage>)Delegate.CreateDelegate(typeof(Func<ZimbraAdminSoapClient, ZimbraMessage[], ZimbraMessage>), methodInfo,); //invoke = new InvokeZimbra(client, messages); //Delegate zimbraDelegate = InvokeZimbra.CreateDelegate(client.GetType(),methodInfo); //Task<object> response = (Task<object>)zimbraDelegate.DynamicInvoke(messages); //Task<object> response = (Task<object>)methodInfo.Invoke(client, new object[] { zimbraMessage }); //object response = methodInfo.Invoke(client, new object[] { zimbraMessage }); //return (ZimbraMessage)response; return(response); } catch (FaultException fex) { throw fex; } catch (Exception ex) { if (ex.InnerException != null && ex.InnerException.GetType() == typeof(FaultException)) { throw ex.InnerException; } throw ex; } }
public async Task <ZimbraMessage> Message(ZimbraMessage zimbraMessage) { ZimbraMessage message = null; bool reauthenticate = false; try { if (!Authenticated.Value && !AuthenticatedAdmin.Value) { Authenticate(); } /* * if (AuthenticationExpired && Authenticated.Value) * { * Authenticate(); * } * * if (AuthenticationAdminExpired && AuthenticatedAdmin.Value) * { * Authenticate(); * } */ string ns = zimbraMessage.GetType().Namespace; switch (ns) { case "ClubCloud.Zimbra.Account": message = await ProcessAccountMessage(zimbraMessage); break; case "ClubCloud.Zimbra.Administration": message = await ProcessAdministrationMessage(zimbraMessage); break; case "ClubCloud.Zimbra.Administration.Extended": message = await ProcessAdministrationExtendedMessage(zimbraMessage); break; case "ClubCloud.Zimbra.Mail": message = await ProcessMailMessage(zimbraMessage); break; case "ClubCloud.Zimbra.Replication": message = await ProcessReplicationMessage(zimbraMessage); break; case "ClubCloud.Zimbra.Synchronization": message = await ProcessSynchronizationMessage(zimbraMessage); break; case "ClubCloud.Zimbra.Voice": message = await ProcessVoiceMessage(zimbraMessage); break; default: { message = new ZimbraMessage(); break; } } } catch (TargetInvocationException tiex) { //bool reauthenticate = false; if (tiex.InnerException.GetType() == typeof(FaultException)) { if (tiex.InnerException.Message.Equals("no valid authtoken present", StringComparison.InvariantCultureIgnoreCase)) { reauthenticate = true; } else { throw tiex; } } } catch (FaultException fiex) { if (fiex.Message.Equals("no valid authtoken present", StringComparison.InvariantCultureIgnoreCase)) { reauthenticate = true; } else { throw fiex; } } if (reauthenticate) { Authenticate(); message = await Message(zimbraMessage); } return(message); }