Пример #1
0
        public override bool Handle(string httpMethod, string path, string querystring, HttpHeaders headers, XmlDocument request, out XmlDocument response)
        {
            response = null;

            try
            {
                object result;
                if (_invoker.Invoke(request, out result))
                {
                    response = XmlRpcFormatter.EncodeResponse(result);
                    return(true);
                }
                if (_final)
                {
                    string   methodName;
                    object[] parameters;
                    XmlRpcParser.Parse(request, out methodName, out parameters);
                    response = XmlRpcFormatter.EncodeFault(405, "XML-RPC method '" + methodName + "' not implemented");
                    return(true);
                }
                return(false);
            }
            catch (XmlRpcServerException xpse)
            {
                response = XmlRpcFormatter.EncodeFault(xpse.FaultCode, xpse.FaultString);
            }
            catch (Exception e)
            {
                response = XmlRpcFormatter.EncodeFault(500, e.Message);
            }
            return(true);
        }
Пример #2
0
        public bool Invoke(XmlDocument xmlRpcRequest, out object result)
        {
            string methodName;

            object[] parameters;
            XmlRpcParser.Parse(xmlRpcRequest, out methodName, out parameters);

            MethodInfo mi = (MethodInfo)_methods[methodName];

            if (mi != null)
            {
                ParameterInfo[] parameterInfos = mi.GetParameters();
                for (int i = 0; i < parameters.Length && i < parameterInfos.Length; i++)
                {
                    parameters[i] = XmlRpcSerializer.FromXmlRpc(parameters[i], parameterInfos[i].ParameterType);
                }
                object invokeResult;
                try
                {
                    invokeResult = mi.Invoke(_target, parameters);
                }
                catch (TargetInvocationException tie)
                {
                    throw tie.InnerException;
                }
                result = XmlRpcSerializer.ToXmlRpc(invokeResult);
                return(true);
            }

            if (_dynamicInvoke != null)
            {
                if (_dynamicInvoke.Invoke(methodName, parameters, out result))
                {
                    result = XmlRpcSerializer.ToXmlRpc(result);
                    return(true);
                }
            }

            result = null;
            return(false);
        }