Exemplo n.º 1
0
        public object DeserializeInputParameter(
            System.Xml.XmlDictionaryReader xmlReader,
            Type parameterType,
            string parameterName,
            string parameterNs,
            ICustomAttributeProvider customAttributeProvider,
            IEnumerable <Type> knownTypes = null)
        {
            // Advance past any whitespace.
            while (xmlReader.NodeType == System.Xml.XmlNodeType.Whitespace && xmlReader.Read())
            {
            }

            if (xmlReader.IsStartElement(parameterName, parameterNs))
            {
                xmlReader.MoveToStartElement(parameterName, parameterNs);

                if (xmlReader.IsStartElement(parameterName, parameterNs))
                {
                    switch (_serializer)
                    {
                    case SoapSerializer.XmlSerializer:
                        if (!parameterType.IsArray)
                        {
                            // case [XmlElement("parameter")] int parameter
                            // case [XmlArray("parameter")] int[] parameter
                            return(DeserializeObject(xmlReader, parameterType, parameterName, parameterNs));
                        }
                        else
                        {
                            // case int[] parameter
                            // case [XmlElement("parameter")] int[] parameter
                            // case [XmlArray("parameter"), XmlArrayItem(ElementName = "item")] int[] parameter
                            return(DeserializeArrayXmlSerializer(xmlReader, parameterType, parameterName, parameterNs, customAttributeProvider));
                        }

                    case SoapSerializer.DataContractSerializer:
                        return(DeserializeDataContract(xmlReader, parameterType, parameterName, parameterNs, knownTypes));

                    default:
                        throw new NotImplementedException();
                    }
                }
            }

            if (parameterType.IsArray)
            {
                return(Array.CreateInstance(parameterType.GetElementType(), 0));
            }

            return(null);
        }
Exemplo n.º 2
0
        public object DeserializeInputParameter(
            System.Xml.XmlDictionaryReader xmlReader,
            Type parameterType,
            string parameterName,
            string parameterNs,
            MemberInfo memberInfo,
            IEnumerable <Type> knownTypes = null)
        {
            if (xmlReader.IsStartElement(parameterName, parameterNs))
            {
                xmlReader.MoveToStartElement(parameterName, parameterNs);

                if (xmlReader.IsStartElement(parameterName, parameterNs))
                {
                    switch (_serializer)
                    {
                    case SoapSerializer.XmlSerializer:
                        if (!parameterType.IsArray)
                        {
                            // case [XmlElement("parameter")] int parameter
                            // case [XmlArray("parameter")] int[] parameter
                            return(DeserializeObject(xmlReader, parameterType, parameterName, parameterNs));
                        }
                        else
                        {
                            // case int[] parameter
                            // case [XmlElement("parameter")] int[] parameter
                            // case [XmlArray("parameter"), XmlArrayItem(ElementName = "item")] int[] parameter
                            return(DeserializeArrayXmlSerializer(xmlReader, parameterType, parameterName, parameterNs, memberInfo));
                        }

                    case SoapSerializer.DataContractSerializer:
                        return(DeserializeDataContract(xmlReader, parameterType, parameterName, parameterNs, knownTypes));

                    default:
                        throw new NotImplementedException();
                    }
                }
            }

            if (parameterType.IsArray)
            {
                return(Array.CreateInstance(parameterType.GetElementType(), 0));
            }

            return(null);
        }
Exemplo n.º 3
0
        public object DeserializeInputParameter(
            System.Xml.XmlDictionaryReader xmlReader,
            Type parameterType,
            string parameterName,
            string parameterNs,
            SoapMethodParameterInfo parameterInfo = null,
            IEnumerable <Type> knownTypes         = null)
        {
            if (xmlReader.IsStartElement(parameterName, parameterNs))
            {
                xmlReader.MoveToStartElement(parameterName, parameterNs);

                if (xmlReader.IsStartElement(parameterName, parameterNs))
                {
                    switch (_serializer)
                    {
                    case SoapSerializer.XmlSerializer:
                        if (!parameterType.IsArray || (parameterInfo != null && parameterInfo.ArrayName != null && parameterInfo.ArrayItemName == null))
                        {
                            // case [XmlElement("parameter")] int parameter
                            // case int[] parameter
                            // case [XmlArray("parameter")] int[] parameter
                            return(DeserializeObject(xmlReader, parameterType, parameterName, parameterNs));
                        }
                        else
                        {
                            // case [XmlElement("parameter")] int[] parameter
                            // case [XmlArray("parameter"), XmlArrayItem(ElementName = "item")] int[] parameter
                            return(DeserializeArray(xmlReader, parameterType, parameterName, parameterNs, parameterInfo));
                        }

                    case SoapSerializer.DataContractSerializer:
                        return(DeserializeDataContract(xmlReader, parameterType, parameterName, parameterNs, knownTypes));

                    default:
                        throw new NotImplementedException();
                    }
                }
            }

            return(null);
        }
Exemplo n.º 4
0
        private object[] GetRequestArguments(Message requestMessage, System.Xml.XmlDictionaryReader xmlReader, OperationDescription operation, ref Dictionary <string, object> outArgs)
        {
            var parameters = operation.NormalParameters;
            // avoid reallocation
            var arguments = new List <object>(parameters.Length + operation.OutParameters.Length);

            // Find the element for the operation's data
            xmlReader.ReadStartElement(operation.Name, operation.Contract.Namespace);

            for (int i = 0; i < parameters.Length; i++)
            {
                var parameterName = parameters[i].Name;
                var parameterNs   = parameters[i].Namespace;

                if (xmlReader.IsStartElement(parameterName, parameterNs))
                {
                    xmlReader.MoveToStartElement(parameterName, parameterNs);

                    if (xmlReader.IsStartElement(parameterName, parameterNs))
                    {
                        var elementType = parameters[i].Parameter.ParameterType.GetElementType();
                        if (elementType == null || parameters[i].Parameter.ParameterType.IsArray)
                        {
                            elementType = parameters[i].Parameter.ParameterType;
                        }

                        switch (_serializer)
                        {
                        case SoapSerializer.XmlSerializer:
                        {
                            // see https://referencesource.microsoft.com/System.Xml/System/Xml/Serialization/XmlSerializer.cs.html#c97688a6c07294d5
                            var serializer = CachedXmlSerializer.GetXmlSerializer(elementType, parameterName, parameterNs);
                            lock (serializer)
                                arguments.Add(serializer.Deserialize(xmlReader));
                        }
                        break;

                        case SoapSerializer.DataContractSerializer:
                        {
                            var serializer = new DataContractSerializer(elementType, parameterName, parameterNs);
                            arguments.Add(serializer.ReadObject(xmlReader, verifyObjectName: true));
                        }
                        break;

                        default: throw new NotImplementedException();
                        }
                    }
                }
                else
                {
                    arguments.Add(null);
                }
            }

            foreach (var parameterInfo in operation.OutParameters)
            {
                if (parameterInfo.Parameter.ParameterType.Name == "Guid&")
                {
                    outArgs[parameterInfo.Name] = Guid.Empty;
                }
                else if (parameterInfo.Parameter.ParameterType.Name == "String&" || parameterInfo.Parameter.ParameterType.GetElementType().IsArray)
                {
                    outArgs[parameterInfo.Name] = null;
                }
                else
                {
                    var type = parameterInfo.Parameter.ParameterType.GetElementType();
                    outArgs[parameterInfo.Name] = Activator.CreateInstance(type);
                }
            }
            return(arguments.ToArray());
        }
Exemplo n.º 5
0
        private object[] GetRequestArguments(Message requestMessage, System.Xml.XmlDictionaryReader xmlReader, OperationDescription operation, ref Dictionary <string, object> outArgs)
        {
            var parameters = operation.DispatchMethod.GetParameters().Where(x => !x.IsOut && !x.ParameterType.IsByRef).ToArray();
            var arguments  = new List <object>();

            // Find the element for the operation's data
            xmlReader.ReadStartElement(operation.Name, operation.Contract.Namespace);

            for (int i = 0; i < parameters.Length; i++)
            {
                var elementAttribute = parameters[i].GetCustomAttribute <XmlElementAttribute>();
                var parameterName    = !string.IsNullOrEmpty(elementAttribute?.ElementName)
                                                                                ? elementAttribute.ElementName
                                                                                : parameters[i].GetCustomAttribute <MessageParameterAttribute>()?.Name ?? parameters[i].Name;
                var parameterNs = elementAttribute?.Namespace ?? operation.Contract.Namespace;

                if (xmlReader.IsStartElement(parameterName, parameterNs))
                {
                    xmlReader.MoveToStartElement(parameterName, parameterNs);

                    if (xmlReader.IsStartElement(parameterName, parameterNs))
                    {
                        var elementType = parameters[i].ParameterType.GetElementType();
                        if (elementType == null || parameters[i].ParameterType.IsArray)
                        {
                            elementType = parameters[i].ParameterType;
                        }

                        switch (_serializer)
                        {
                        case SoapSerializer.XmlSerializer:
                        {
                            // see https://referencesource.microsoft.com/System.Xml/System/Xml/Serialization/XmlSerializer.cs.html#c97688a6c07294d5
                            var serializer = new XmlSerializer(elementType, null, new Type[0], new XmlRootAttribute(parameterName), parameterNs);
                            arguments.Add(serializer.Deserialize(xmlReader));
                        }
                        break;

                        case SoapSerializer.DataContractSerializer:
                        {
                            var serializer = new DataContractSerializer(elementType, parameterName, parameterNs);
                            arguments.Add(serializer.ReadObject(xmlReader, verifyObjectName: true));
                        }
                        break;

                        default: throw new NotImplementedException();
                        }
                    }
                }
                else
                {
                    arguments.Add(null);
                }
            }

            var outParams = operation.DispatchMethod.GetParameters().Where(x => x.IsOut || x.ParameterType.IsByRef).ToArray();

            foreach (var parameterInfo in outParams)
            {
                if (parameterInfo.ParameterType.Name == "Guid&")
                {
                    outArgs[parameterInfo.Name] = Guid.Empty;
                }
                else if (parameterInfo.ParameterType.Name == "String&" || parameterInfo.ParameterType.GetElementType().IsArray)
                {
                    outArgs[parameterInfo.Name] = null;
                }
                else
                {
                    var type = parameterInfo.ParameterType.GetElementType();
                    outArgs[parameterInfo.Name] = Activator.CreateInstance(type);
                }
            }
            return(arguments.ToArray());
        }
Exemplo n.º 6
0
        private object[] GetRequestArguments(Message requestMessage, System.Xml.XmlDictionaryReader xmlReader, OperationDescription operation)
        {
            var arguments = new object[operation.AllParameters.Length];

            // Find the element for the operation's data
            if (!operation.IsMessageContractRequest)
            {
                xmlReader.ReadStartElement(operation.Name, operation.Contract.Namespace);
            }

            // if any ordering issues, possible to rewrite like:

            /*while (!xmlReader.EOF)
             * {
             *      var parameterInfo = operation.InParameters.FirstOrDefault(p => p.Name == xmlReader.LocalName && p.Namespace == xmlReader.NamespaceURI);
             *      if (parameterInfo == null)
             *      {
             *              xmlReader.Skip();
             *              continue;
             *      }
             *      var parameterName = parameterInfo.Name;
             *      var parameterNs = parameterInfo.Namespace;
             *      ...
             * }*/

            foreach (var parameterInfo in operation.InParameters)
            {
                var parameterName = parameterInfo.Name;
                var parameterNs   = parameterInfo.Namespace;

                if (xmlReader.IsStartElement(parameterName, parameterNs))
                {
                    xmlReader.MoveToStartElement(parameterName, parameterNs);

                    if (xmlReader.IsStartElement(parameterName, parameterNs))
                    {
                        var elementType = parameterInfo.Parameter.ParameterType.GetElementType();
                        if (elementType == null || parameterInfo.Parameter.ParameterType.IsArray)
                        {
                            elementType = parameterInfo.Parameter.ParameterType;
                        }

                        switch (_serializer)
                        {
                        case SoapSerializer.XmlSerializer:
                        {
                            // see https://referencesource.microsoft.com/System.Xml/System/Xml/Serialization/XmlSerializer.cs.html#c97688a6c07294d5
                            var serializer = CachedXmlSerializer.GetXmlSerializer(elementType, parameterName, parameterNs);
                            lock (serializer)
                            {
                                arguments[parameterInfo.Index] = serializer.Deserialize(xmlReader);
                            }
                        }

                        break;

                        case SoapSerializer.DataContractSerializer:
                        {
                            var serializer = new DataContractSerializer(elementType, parameterName, parameterNs);
                            arguments[parameterInfo.Index] = serializer.ReadObject(xmlReader, verifyObjectName: true);
                        }

                        break;

                        default: throw new NotImplementedException();
                        }
                    }
                }
                else
                {
                    arguments[parameterInfo.Index] = null;
                }
            }

            foreach (var parameterInfo in operation.OutParameters)
            {
                if (arguments[parameterInfo.Index] != null)
                {
                    // do not overwrite input ref parameters
                    continue;
                }

                if (parameterInfo.Parameter.ParameterType.Name == "Guid&")
                {
                    arguments[parameterInfo.Index] = Guid.Empty;
                }
                else if (parameterInfo.Parameter.ParameterType.Name == "String&" || parameterInfo.Parameter.ParameterType.GetElementType().IsArray)
                {
                    arguments[parameterInfo.Index] = null;
                }
                else
                {
                    var type = parameterInfo.Parameter.ParameterType.GetElementType();
                    arguments[parameterInfo.Index] = Activator.CreateInstance(type);
                }
            }

            return(arguments);
        }
Exemplo n.º 7
0
        private object[] GetRequestArguments(Message requestMessage, System.Xml.XmlDictionaryReader xmlReader, OperationDescription operation, HttpContext httpContext)
        {
            var arguments = new object[operation.AllParameters.Length];

            // Find the element for the operation's data
            if (!operation.IsMessageContractRequest)
            {
                xmlReader.ReadStartElement(operation.Name, operation.Contract.Namespace);
            }

            // if any ordering issues, possible to rewrite like:

            /*while (!xmlReader.EOF)
             * {
             *      var parameterInfo = operation.InParameters.FirstOrDefault(p => p.Name == xmlReader.LocalName && p.Namespace == xmlReader.NamespaceURI);
             *      if (parameterInfo == null)
             *      {
             *              xmlReader.Skip();
             *              continue;
             *      }
             *      var parameterName = parameterInfo.Name;
             *      var parameterNs = parameterInfo.Namespace;
             *      ...
             * }*/

            foreach (var parameterInfo in operation.InParameters)
            {
                var parameterName = parameterInfo.Name;

                var parameterNs = parameterInfo.Namespace ?? operation.Contract.Namespace;

                if (xmlReader.IsStartElement(parameterName, parameterNs))
                {
                    xmlReader.MoveToStartElement(parameterName, parameterNs);

                    if (xmlReader.IsStartElement(parameterName, parameterNs))
                    {
                        switch (_serializer)
                        {
                        case SoapSerializer.XmlSerializer:
                        {
                            // case [XmlElement("parameter")] int parameter
                            // case int[] parameter
                            // case [XmlArray("parameter")] int[] parameter
                            if (!parameterInfo.Parameter.ParameterType.IsArray || (parameterInfo.ArrayName != null && parameterInfo.ArrayItemName == null))
                            {
                                // see https://referencesource.microsoft.com/System.Xml/System/Xml/Serialization/XmlSerializer.cs.html#c97688a6c07294d5
                                var elementType = parameterInfo.Parameter.ParameterType.GetElementType();
                                if (elementType == null || parameterInfo.Parameter.ParameterType.IsArray)
                                {
                                    elementType = parameterInfo.Parameter.ParameterType;
                                }

                                var serializer = CachedXmlSerializer.GetXmlSerializer(elementType, parameterName, parameterNs);
                                lock (serializer)
                                {
                                    arguments[parameterInfo.Index] = serializer.Deserialize(xmlReader);
                                }
                            }

                            // case [XmlElement("parameter")] int[] parameter
                            // case [XmlArray("parameter"), XmlArrayItem(ElementName = "item")] int[] parameter
                            else
                            {
                                //if (parameterInfo.ArrayItemName != null)
                                {
                                    xmlReader.ReadStartElement(parameterName, parameterNs);
                                }

                                var elementType = parameterInfo.Parameter.ParameterType.GetElementType();

                                var localName = parameterInfo.ArrayItemName ?? elementType.Name;
                                if (parameterInfo.ArrayItemName == null && elementType.Namespace.StartsWith("System"))
                                {
                                    localName = localName.ToLower();
                                }

                                //localName = "ComplexModelInput";
                                var deserializeMethod = typeof(XmlSerializerExtensions)
                                                        .GetGenericMethod(nameof(XmlSerializerExtensions.DeserializeArray), new[] { elementType });
                                var serializer = CachedXmlSerializer.GetXmlSerializer(elementType, localName, parameterNs);
                                lock (serializer)
                                {
                                    arguments[parameterInfo.Index] = deserializeMethod.Invoke(null, new object[] { serializer, localName, parameterNs, xmlReader });
                                }

                                //if (parameterInfo.ArrayItemName != null)
                                {
                                    xmlReader.ReadEndElement();
                                }
                            }
                        }

                        break;

                        case SoapSerializer.DataContractSerializer:
                        {
                            var elementType = parameterInfo.Parameter.ParameterType.GetElementType();
                            if (elementType == null || parameterInfo.Parameter.ParameterType.IsArray)
                            {
                                elementType = parameterInfo.Parameter.ParameterType;
                            }

                            var serializer = new DataContractSerializer(elementType, parameterName, parameterNs);
                            arguments[parameterInfo.Index] = serializer.ReadObject(xmlReader, verifyObjectName: true);
                        }

                        break;

                        default: throw new NotImplementedException();
                        }
                    }
                }
                else if (parameterInfo.Parameter.ParameterType == typeof(HttpContext))
                {
                    arguments[parameterInfo.Index] = httpContext;
                }
                else
                {
                    arguments[parameterInfo.Index] = null;
                }
            }

            foreach (var parameterInfo in operation.OutParameters)
            {
                if (arguments[parameterInfo.Index] != null)
                {
                    // do not overwrite input ref parameters
                    continue;
                }

                if (parameterInfo.Parameter.ParameterType.Name == "Guid&")
                {
                    arguments[parameterInfo.Index] = Guid.Empty;
                }
                else if (parameterInfo.Parameter.ParameterType.Name == "String&" || parameterInfo.Parameter.ParameterType.GetElementType().IsArray)
                {
                    arguments[parameterInfo.Index] = null;
                }
                else
                {
                    var type = parameterInfo.Parameter.ParameterType.GetElementType();
                    arguments[parameterInfo.Index] = Activator.CreateInstance(type);
                }
            }

            return(arguments);
        }