/// <summary> /// Deserialize the request /// </summary> public void DeserializeRequest(EndpointOperation operation, RestRequestMessage request, object[] parameters) { try { var httpRequest = RestOperationContext.Current.IncomingRequest; string contentType = httpRequest.Headers["Content-Type"]; for (int pNumber = 0; pNumber < parameters.Length; pNumber++) { var parm = operation.Description.InvokeMethod.GetParameters()[pNumber]; // Simple parameter if (parameters[pNumber] != null) { continue; } // Use XML Serializer if (contentType?.StartsWith("application/fhir+xml") == true) { using (XmlReader bodyReader = XmlReader.Create(request.Body)) { while (bodyReader.NodeType != XmlNodeType.Element) { bodyReader.Read(); } Type eType = s_knownTypes.FirstOrDefault(o => o.GetCustomAttribute <XmlRootAttribute>()?.ElementName == bodyReader.LocalName && o.GetCustomAttribute <XmlRootAttribute>()?.Namespace == bodyReader.NamespaceURI); var serializer = XmlModelSerializerFactory.Current.CreateSerializer(eType); parameters[pNumber] = serializer.Deserialize(request.Body); } } // Use JSON Serializer else if (contentType?.StartsWith("application/fhir+json") == true) { // Now read the JSON data Object fhirObject = null; using (StreamReader sr = new StreamReader(request.Body)) { string fhirContent = sr.ReadToEnd(); fhirObject = new FhirJsonParser().Parse(fhirContent); } // Now we want to serialize the FHIR MODEL object and re-parse as our own API bundle object if (fhirObject != null) { MemoryStream ms = new MemoryStream(new FhirXmlSerializer().SerializeToBytes(fhirObject as Hl7.Fhir.Model.Resource)); var xsz = XmlModelSerializerFactory.Current.CreateSerializer(fhirObject.GetType()); parameters[pNumber] = xsz.Deserialize(ms); } else { parameters[pNumber] = null; } } else if (contentType != null)// TODO: Binaries { throw new InvalidOperationException("Invalid request format"); } } } catch (Exception e) { this.m_traceSource.TraceEvent(EventLevel.Error, e.ToString()); throw; } }