Esempio n. 1
0
        public void SendMessage(string handler, IList arguments)
        {
            BeginUpdate();
            try
            {
                _so.SendMessage(handler, arguments);
            }
            finally
            {
                EndUpdate();
            }

            // Invoke method on registered handler
            string serviceName, serviceMethod;
            int    dotPos = handler.LastIndexOf(".");

            if (dotPos != -1)
            {
                serviceName   = handler.Substring(0, dotPos);
                serviceMethod = handler.Substring(dotPos + 1);
            }
            else
            {
                serviceName   = string.Empty;
                serviceMethod = handler;
            }

            object soHandler = GetServiceHandler(serviceName);

            if (soHandler == null && this.HasParent)
            {
                // No custom handler, check for service defined in the scope's context
                IScopeContext context = this.Parent.Context;
                try
                {
                    //Search for a handler only if there is a service name specified
                    if (serviceName != string.Empty)
                    {
                        // The type must have a name of "SharedObjectName.DottedServiceName"
                        soHandler = ObjectFactory.CreateInstance(_so.Name + "." + serviceName);
                    }
                }
                catch (Exception)
                {
                    // No such type.
                    log.Debug(__Res.GetString(__Res.Type_InitError, _so.Name + "." + serviceName));
                }
            }

            if (soHandler != null)
            {
                MethodInfo mi = MethodHandler.GetMethod(soHandler.GetType(), serviceMethod, arguments);
                if (mi != null)
                {
                    ParameterInfo[] parameterInfos = mi.GetParameters();
                    object[]        args           = new object[parameterInfos.Length];
                    arguments.CopyTo(args, 0);
                    TypeHelper.NarrowValues(args, parameterInfos);
                    try
                    {
                        InvocationHandler invocationHandler = new InvocationHandler(mi);
                        object            result            = invocationHandler.Invoke(soHandler, args);
                    }
                    catch (Exception exception)
                    {
                        log.Error(__Res.GetString(__Res.ServiceHandler_InvocationFailed, serviceMethod, handler), exception);
                    }
                }
            }

            // Notify server listeners
            foreach (ISharedObjectListener listener in _serverListeners)
            {
                listener.OnSharedObjectSend(this, handler, arguments);
            }
        }