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); }
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); }
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); }
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()); }
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()); }
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); }
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); }