//----------------------------------------------------------------------------- // Copyright (c) Microsoft Corporation. All rights reserved. //----------------------------------------------------------------------------- namespace System.ServiceModel.Dispatcher { using System.Collections; using System.ServiceModel.Channels; using System.ServiceModel; using System.ServiceModel.Description; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Reflection; using System.Xml; using System.ServiceModel.Diagnostics; using System.Runtime.Serialization; using System.Net; using System.Runtime.Serialization.Json; class DataContractJsonSerializerOperationFormatter : DataContractSerializerOperationFormatter { bool isBareMessageContractReply; bool isBareMessageContractRequest; // isWrapped is true when the user has explicitly chosen the response or request format to be Wrapped (allowed only in WebHttpBehavior) bool isWrapped; bool useAspNetAjaxJson; string callbackParameterName; public DataContractJsonSerializerOperationFormatter(OperationDescription description, int maxItemsInObjectGraph, bool ignoreExtensionDataObject, System.Runtime.Serialization.IDataContractSurrogate dataContractSurrogate, bool isWrapped, bool useAspNetAjaxJson, string callbackParameterName) : base(description, TypeLoader.DefaultDataContractFormatAttribute, new DataContractJsonSerializerOperationBehavior(description, maxItemsInObjectGraph, ignoreExtensionDataObject, dataContractSurrogate, useAspNetAjaxJson)) { if (this.requestMessageInfo != null) { if (this.requestMessageInfo.WrapperName == null) { isBareMessageContractRequest = true; } else { this.requestMessageInfo.WrapperName = JsonGlobals.rootDictionaryString; this.requestMessageInfo.WrapperNamespace = XmlDictionaryString.Empty; } } if (this.replyMessageInfo != null) { if (this.replyMessageInfo.WrapperName == null) { isBareMessageContractReply = true; } else { if (useAspNetAjaxJson) { this.replyMessageInfo.WrapperName = JsonGlobals.dDictionaryString; } else { this.replyMessageInfo.WrapperName = JsonGlobals.rootDictionaryString; } this.replyMessageInfo.WrapperNamespace = XmlDictionaryString.Empty; } } if ((this.requestStreamFormatter != null) && (this.requestStreamFormatter.WrapperName != null)) { this.requestStreamFormatter.WrapperName = JsonGlobals.rootString; this.requestStreamFormatter.WrapperNamespace = string.Empty; } if ((this.replyStreamFormatter != null) && (this.replyStreamFormatter.WrapperName != null)) { this.replyStreamFormatter.WrapperName = JsonGlobals.rootString; this.replyStreamFormatter.WrapperNamespace = string.Empty; } this.isWrapped = isWrapped; this.useAspNetAjaxJson = useAspNetAjaxJson; this.callbackParameterName = callbackParameterName; } internal static bool IsJsonLocalName(XmlDictionaryReader reader, string elementName) { if (reader.IsStartElement(JsonGlobals.itemDictionaryString, JsonGlobals.itemDictionaryString)) { if (reader.MoveToAttribute(JsonGlobals.itemString)) { return (reader.Value == elementName); } } return false; } internal static bool IsStartElement(XmlDictionaryReader reader, string elementName) { if (reader.IsStartElement(elementName)) { return true; } return IsJsonLocalName(reader, elementName); } internal static bool IsStartElement(XmlDictionaryReader reader, XmlDictionaryString elementName, XmlDictionaryString elementNamespace) { if (reader.IsStartElement(elementName, elementNamespace)) { return true; } return IsJsonLocalName(reader, (elementName == null) ? null : elementName.Value); } protected override void AddHeadersToMessage(Message message, MessageDescription messageDescription, object[] parameters, bool isRequest) { if (message != null) { message.Properties.Add(WebBodyFormatMessageProperty.Name, WebBodyFormatMessageProperty.JsonProperty); } base.AddHeadersToMessage(message, messageDescription, parameters, isRequest); } protected override object DeserializeBody(XmlDictionaryReader reader, MessageVersion version, string action, MessageDescription messageDescription, object[] parameters, bool isRequest) { if (reader == null) { throw System.ServiceModel.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException("reader")); } if (parameters == null) { throw System.ServiceModel.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException("parameters")); } if (reader.EOF) { return null; } if ((isRequest && this.isBareMessageContractRequest) || (!isRequest && isBareMessageContractReply)) { return DeserializeBareMessageContract(reader, parameters, isRequest); } object returnValue = null; if (isRequest || (isWrapped && !useAspNetAjaxJson)) { ValidateTypeObjectAttribute(reader, isRequest); returnValue = DeserializeBodyCore(reader, parameters, isRequest); } else { if (useAspNetAjaxJson) { ReadRootElement(reader); } if (useAspNetAjaxJson && messageDescription.IsVoid) { ReadVoidReturn(reader); } else if (replyMessageInfo.ReturnPart != null) { PartInfo part = replyMessageInfo.ReturnPart; DataContractJsonSerializer serializer = part.Serializer as DataContractJsonSerializer; if (useAspNetAjaxJson) { serializer = RecreateDataContractJsonSerializer(serializer, JsonGlobals.dString); VerifyIsStartElement(reader, JsonGlobals.dString); } else { serializer = RecreateDataContractJsonSerializer(serializer, JsonGlobals.rootString); VerifyIsStartElement(reader, JsonGlobals.rootString); } if (serializer.IsStartObject(reader)) { try { returnValue = part.ReadObject(reader, serializer); } catch (System.InvalidOperationException e) { throw System.ServiceModel.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException( System.ServiceModel.SR.GetString(System.ServiceModel.SR.SFxInvalidMessageBodyErrorDeserializingParameter, part.Description.Namespace, part.Description.Name), e)); } catch (System.Runtime.Serialization.InvalidDataContractException e) { throw System.ServiceModel.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new System.Runtime.Serialization.InvalidDataContractException( System.ServiceModel.SR.GetString(System.ServiceModel.SR.SFxInvalidMessageBodyErrorDeserializingParameter, part.Description.Namespace, part.Description.Name), e)); } catch (System.FormatException e) { throw System.ServiceModel.DiagnosticUtility.ExceptionUtility.ThrowHelperError( OperationFormatter.CreateDeserializationFailedFault( System.ServiceModel.SR.GetString(System.ServiceModel.SR.SFxInvalidMessageBodyErrorDeserializingParameterMore, part.Description.Namespace, part.Description.Name, e.Message), e)); } catch (System.Runtime.Serialization.SerializationException e) { throw System.ServiceModel.DiagnosticUtility.ExceptionUtility.ThrowHelperError( OperationFormatter.CreateDeserializationFailedFault( System.ServiceModel.SR.GetString(System.ServiceModel.SR.SFxInvalidMessageBodyErrorDeserializingParameterMore, part.Description.Namespace, part.Description.Name, e.Message), e)); } } } else if (replyMessageInfo.BodyParts != null) { ValidateTypeObjectAttribute(reader, isRequest); returnValue = DeserializeBodyCore(reader, parameters, isRequest); } while (reader.IsStartElement()) { OperationFormatter.TraceAndSkipElement(reader); } if (useAspNetAjaxJson) { reader.ReadEndElement(); } } return returnValue; } protected override void GetHeadersFromMessage(Message message, MessageDescription messageDescription, object[] parameters, bool isRequest) { if (message != null) { object prop; message.Properties.TryGetValue(WebBodyFormatMessageProperty.Name, out prop); WebBodyFormatMessageProperty formatProperty = (prop as WebBodyFormatMessageProperty); if (formatProperty == null) { throw System.ServiceModel.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR2.GetString(SR2.MessageFormatPropertyNotFound2, this.OperationName))); } if (formatProperty.Format != WebContentFormat.Json) { throw System.ServiceModel.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR2.GetString(SR2.InvalidHttpMessageFormat3, this.OperationName, formatProperty.Format, WebContentFormat.Json))); } } base.GetHeadersFromMessage(message, messageDescription, parameters, isRequest); } protected override void SerializeBody(XmlDictionaryWriter writer, MessageVersion version, string action, MessageDescription messageDescription, object returnValue, object[] parameters, bool isRequest) { if ((isRequest && this.isBareMessageContractRequest) || (!isRequest && isBareMessageContractReply)) { SerializeBareMessageContract(writer, parameters, isRequest); } else { bool isJsonp = WebHttpBehavior.TrySetupJavascriptCallback(callbackParameterName) != null; bool useAspNetJsonWrapper = !isJsonp && useAspNetAjaxJson; if (isRequest || (isWrapped && !useAspNetJsonWrapper)) { SerializeBody(writer, returnValue, parameters, isRequest); } else { if (useAspNetJsonWrapper) { writer.WriteStartElement(JsonGlobals.rootString); writer.WriteAttributeString(JsonGlobals.typeString, JsonGlobals.objectString); } if (useAspNetJsonWrapper && messageDescription.IsVoid) { WriteVoidReturn(writer); } else if (isJsonp && messageDescription.IsVoid) { writer.WriteStartElement(JsonGlobals.rootString); writer.WriteAttributeString(JsonGlobals.typeString, JsonGlobals.nullString); writer.WriteEndElement(); } else if (replyMessageInfo.ReturnPart != null) { DataContractJsonSerializer serializer = replyMessageInfo.ReturnPart.Serializer as DataContractJsonSerializer; if (useAspNetJsonWrapper) { serializer = RecreateDataContractJsonSerializer(serializer, JsonGlobals.dString); } else { serializer = RecreateDataContractJsonSerializer(serializer, JsonGlobals.rootString); } try { serializer.WriteObject(writer, returnValue); } catch (SerializationException sx) { throw System.ServiceModel.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new CommunicationException( System.ServiceModel.SR.GetString(System.ServiceModel.SR.SFxInvalidMessageBodyErrorSerializingParameter, replyMessageInfo.ReturnPart.Description.Namespace, replyMessageInfo.ReturnPart.Description.Name, sx.Message), sx)); } } else if (replyMessageInfo.BodyParts != null) { SerializeBody(writer, returnValue, parameters, isRequest); } if (useAspNetJsonWrapper) { writer.WriteEndElement(); } } } } static DataContractJsonSerializer RecreateDataContractJsonSerializer(DataContractJsonSerializer serializer, string newRootName) { DataContractJsonSerializerSettings settings = new DataContractJsonSerializerSettings { RootName = newRootName, KnownTypes = serializer.KnownTypes, MaxItemsInObjectGraph = serializer.MaxItemsInObjectGraph, IgnoreExtensionDataObject = serializer.IgnoreExtensionDataObject, DataContractSurrogate = serializer.DataContractSurrogate, EmitTypeInformation = serializer.EmitTypeInformation, DateTimeFormat = serializer.DateTimeFormat, UseSimpleDictionaryFormat = serializer.UseSimpleDictionaryFormat }; return new DataContractJsonSerializer(serializer.GetDeserializeType(), settings); } object DeserializeBareMessageContract(XmlDictionaryReader reader, object[] parameters, bool isRequest) { MessageInfo messageInfo; if (isRequest) { messageInfo = this.requestMessageInfo; } else { messageInfo = this.replyMessageInfo; } if (useAspNetAjaxJson && !isRequest) { ReadRootElement(reader); if (messageInfo.BodyParts.Length == 0) { ReadVoidReturn(reader); } } if (messageInfo.BodyParts.Length > 0) { PartInfo part = messageInfo.BodyParts[0]; DataContractJsonSerializer serializer = part.Serializer as DataContractJsonSerializer; if (useAspNetAjaxJson && !isRequest) { serializer = RecreateDataContractJsonSerializer(serializer, JsonGlobals.dString); } else { serializer = RecreateDataContractJsonSerializer(serializer, JsonGlobals.rootString); } while (reader.IsStartElement()) { if (serializer.IsStartObject(reader)) { try { parameters[part.Description.Index] = part.ReadObject(reader, serializer); break; } catch (System.InvalidOperationException e) { throw System.ServiceModel.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException( System.ServiceModel.SR.GetString(System.ServiceModel.SR.SFxInvalidMessageBodyErrorDeserializingParameter, part.Description.Namespace, part.Description.Name), e)); } catch (System.Runtime.Serialization.InvalidDataContractException e) { throw System.ServiceModel.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataContractException( System.ServiceModel.SR.GetString(System.ServiceModel.SR.SFxInvalidMessageBodyErrorDeserializingParameter, part.Description.Namespace, part.Description.Name), e)); } catch (System.FormatException e) { throw System.ServiceModel.DiagnosticUtility.ExceptionUtility.ThrowHelperError( OperationFormatter.CreateDeserializationFailedFault( System.ServiceModel.SR.GetString(System.ServiceModel.SR.SFxInvalidMessageBodyErrorDeserializingParameterMore, part.Description.Namespace, part.Description.Name, e.Message), e)); } catch (System.Runtime.Serialization.SerializationException e) { throw System.ServiceModel.DiagnosticUtility.ExceptionUtility.ThrowHelperError( OperationFormatter.CreateDeserializationFailedFault( System.ServiceModel.SR.GetString(System.ServiceModel.SR.SFxInvalidMessageBodyErrorDeserializingParameterMore, part.Description.Namespace, part.Description.Name, e.Message), e)); } } else { OperationFormatter.TraceAndSkipElement(reader); } } while (reader.IsStartElement()) { OperationFormatter.TraceAndSkipElement(reader); } } if (this.useAspNetAjaxJson && !isRequest) { reader.ReadEndElement(); } return null; } object DeserializeBodyCore(XmlDictionaryReader reader, object[] parameters, bool isRequest) { MessageInfo messageInfo; if (isRequest) { messageInfo = requestMessageInfo; } else { messageInfo = replyMessageInfo; } if (messageInfo.WrapperName != null) { VerifyIsStartElement(reader, messageInfo.WrapperName, messageInfo.WrapperNamespace); bool isEmptyElement = reader.IsEmptyElement; reader.Read(); if (isEmptyElement) { return null; } } object returnValue = null; DeserializeParameters(reader, messageInfo.BodyParts, parameters, messageInfo.ReturnPart, ref returnValue); if (messageInfo.WrapperName != null) { reader.ReadEndElement(); } return returnValue; } object DeserializeParameter(XmlDictionaryReader reader, PartInfo part) { if (part.Description.Multiple) { ArrayList items = new ArrayList(); while (part.Serializer.IsStartObject(reader)) { items.Add(DeserializeParameterPart(reader, part)); } return items.ToArray(part.Description.Type); } return DeserializeParameterPart(reader, part); } object DeserializeParameterPart(XmlDictionaryReader reader, PartInfo part) { object val; try { val = part.ReadObject(reader); } catch (System.InvalidOperationException e) { throw System.ServiceModel.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException( System.ServiceModel.SR.GetString(System.ServiceModel.SR.SFxInvalidMessageBodyErrorDeserializingParameter, part.Description.Namespace, part.Description.Name), e)); } catch (System.Runtime.Serialization.InvalidDataContractException e) { throw System.ServiceModel.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataContractException( System.ServiceModel.SR.GetString(System.ServiceModel.SR.SFxInvalidMessageBodyErrorDeserializingParameter, part.Description.Namespace, part.Description.Name), e)); } catch (System.FormatException e) { throw System.ServiceModel.DiagnosticUtility.ExceptionUtility.ThrowHelperError( OperationFormatter.CreateDeserializationFailedFault( System.ServiceModel.SR.GetString(System.ServiceModel.SR.SFxInvalidMessageBodyErrorDeserializingParameterMore, part.Description.Namespace, part.Description.Name, e.Message), e)); } catch (System.Runtime.Serialization.SerializationException e) { throw System.ServiceModel.DiagnosticUtility.ExceptionUtility.ThrowHelperError( OperationFormatter.CreateDeserializationFailedFault( System.ServiceModel.SR.GetString(System.ServiceModel.SR.SFxInvalidMessageBodyErrorDeserializingParameterMore, part.Description.Namespace, part.Description.Name, e.Message), e)); } return val; } void DeserializeParameters(XmlDictionaryReader reader, PartInfo[] parts, object[] parameters, PartInfo returnInfo, ref object returnValue) { bool[] setParameters = new bool[parameters.Length]; bool hasReadReturnValue = false; int currentIndex = 0; while (reader.IsStartElement()) { bool hasReadParameter = false; for (int i = 0, index = currentIndex; i < parts.Length; i++, index = (index + 1) % parts.Length) { PartInfo part = parts[index]; if (part.Serializer.IsStartObject(reader)) { currentIndex = i; parameters[part.Description.Index] = DeserializeParameter(reader, part); setParameters[part.Description.Index] = true; hasReadParameter = true; } } if (!hasReadParameter) { if ((returnInfo != null) && !hasReadReturnValue && returnInfo.Serializer.IsStartObject(reader)) { returnValue = DeserializeParameter(reader, returnInfo); hasReadReturnValue = true; } else { OperationFormatter.TraceAndSkipElement(reader); } } } for (int i = 0; i < parameters.Length; i++) { if (!setParameters[i]) { parameters[i] = null; } } } void ReadRootElement(XmlDictionaryReader reader) { if (!IsStartElement(reader, JsonGlobals.rootString)) { throw System.ServiceModel.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new SerializationException(System.ServiceModel.SR.GetString(System.ServiceModel.SR.SFxInvalidMessageBody, JsonGlobals.rootString, string.Empty, reader.NodeType, reader.Name, reader.NamespaceURI))); } string typeAttribute = reader.GetAttribute(JsonGlobals.typeString); if (!typeAttribute.Equals(JsonGlobals.objectString, StringComparison.Ordinal)) { throw System.ServiceModel.DiagnosticUtility.ExceptionUtility.ThrowHelperError( XmlObjectSerializer.CreateSerializationException(SR2.GetString(SR2.JsonFormatterExpectedAttributeObject, typeAttribute))); } bool isEmptyElement = reader.IsEmptyElement; reader.Read(); if (isEmptyElement) { //throw in aspnet case } } void ReadVoidReturn(XmlDictionaryReader reader) { VerifyIsStartElement(reader, JsonGlobals.dString); string typeAttribute = reader.GetAttribute(JsonGlobals.typeString); if (!typeAttribute.Equals(JsonGlobals.nullString, StringComparison.Ordinal)) { throw System.ServiceModel.DiagnosticUtility.ExceptionUtility.ThrowHelperError( XmlObjectSerializer.CreateSerializationException(SR2.GetString(SR2.JsonFormatterExpectedAttributeNull, typeAttribute))); } OperationFormatter.TraceAndSkipElement(reader); } void SerializeBareMessageContract(XmlDictionaryWriter writer, object[] parameters, bool isRequest) { bool useAspNetJsonWrapper = WebHttpBehavior.TrySetupJavascriptCallback(callbackParameterName) == null && useAspNetAjaxJson; if (writer == null) { throw System.ServiceModel.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException("writer")); } if (parameters == null) { throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException("parameters")); } MessageInfo messageInfo; if (isRequest) { messageInfo = this.requestMessageInfo; } else { messageInfo = this.replyMessageInfo; } if (useAspNetJsonWrapper && !isRequest) { writer.WriteStartElement(JsonGlobals.rootString); writer.WriteAttributeString(JsonGlobals.typeString, JsonGlobals.objectString); if (messageInfo.BodyParts.Length == 0) { WriteVoidReturn(writer); } } if (messageInfo.BodyParts.Length > 0) { PartInfo part = messageInfo.BodyParts[0]; DataContractJsonSerializer serializer = part.Serializer as DataContractJsonSerializer; if (useAspNetJsonWrapper && !isRequest) { serializer = RecreateDataContractJsonSerializer(serializer, JsonGlobals.dString); } else { serializer = RecreateDataContractJsonSerializer(serializer, JsonGlobals.rootString); } object graph = parameters[part.Description.Index]; try { serializer.WriteObject(writer, graph); } catch (SerializationException sx) { throw System.ServiceModel.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new CommunicationException( System.ServiceModel.SR.GetString(System.ServiceModel.SR.SFxInvalidMessageBodyErrorSerializingParameter, part.Description.Namespace, part.Description.Name, sx.Message), sx)); } } if (useAspNetJsonWrapper && !isRequest) { writer.WriteEndElement(); } } void SerializeBody(XmlDictionaryWriter writer, object returnValue, object[] parameters, bool isRequest) { if (writer == null) { throw System.ServiceModel.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException("writer")); } if (parameters == null) { throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException("parameters")); } MessageInfo messageInfo; if (isRequest) { messageInfo = requestMessageInfo; } else { messageInfo = replyMessageInfo; } if (messageInfo.WrapperName != null) { if (WebHttpBehavior.TrySetupJavascriptCallback(callbackParameterName) != null) { writer.WriteStartElement(JsonGlobals.rootString); } else { writer.WriteStartElement(messageInfo.WrapperName, messageInfo.WrapperNamespace); } writer.WriteAttributeString(JsonGlobals.typeString, JsonGlobals.objectString); } if (messageInfo.ReturnPart != null) { SerializeParameter(writer, messageInfo.ReturnPart, returnValue); } SerializeParameters(writer, messageInfo.BodyParts, parameters); if (messageInfo.WrapperName != null) { writer.WriteEndElement(); } } void SerializeParameter(XmlDictionaryWriter writer, PartInfo part, object graph) { if (part.Description.Multiple) { if (graph != null) { foreach (object item in (IEnumerable)graph) { SerializeParameterPart(writer, part, item); } } } else { SerializeParameterPart(writer, part, graph); } } void SerializeParameterPart(XmlDictionaryWriter writer, PartInfo part, object graph) { try { part.Serializer.WriteObject(writer, graph); } catch (SerializationException sx) { throw System.ServiceModel.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new CommunicationException( System.ServiceModel.SR.GetString(System.ServiceModel.SR.SFxInvalidMessageBodyErrorSerializingParameter, part.Description.Namespace, part.Description.Name, sx.Message), sx)); } } void SerializeParameters(XmlDictionaryWriter writer, PartInfo[] parts, object[] parameters) { for (int i = 0; i < parts.Length; i++) { PartInfo part = parts[i]; object graph = parameters[part.Description.Index]; SerializeParameter(writer, part, graph); } } void ValidateTypeObjectAttribute(XmlDictionaryReader reader, bool isRequest) { MessageInfo messageInfo = isRequest ? requestMessageInfo : replyMessageInfo; if (messageInfo.WrapperName != null) { if (!IsStartElement(reader, messageInfo.WrapperName, messageInfo.WrapperNamespace)) { throw System.ServiceModel.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new SerializationException(System.ServiceModel.SR.GetString(System.ServiceModel.SR.SFxInvalidMessageBody, messageInfo.WrapperName, messageInfo.WrapperNamespace, reader.NodeType, reader.Name, reader.NamespaceURI))); } string typeAttribute = reader.GetAttribute(JsonGlobals.typeString); if (!typeAttribute.Equals(JsonGlobals.objectString, StringComparison.Ordinal)) { throw System.ServiceModel.DiagnosticUtility.ExceptionUtility.ThrowHelperError( XmlObjectSerializer.CreateSerializationException(SR2.GetString(SR2.JsonFormatterExpectedAttributeObject, typeAttribute))); } } } void VerifyIsStartElement(XmlDictionaryReader reader, string elementName) { bool foundElement = false; while (reader.IsStartElement()) { if (IsStartElement(reader, elementName)) { foundElement = true; break; } else { OperationFormatter.TraceAndSkipElement(reader); } } if (!foundElement) { throw System.ServiceModel.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new SerializationException(System.ServiceModel.SR.GetString(System.ServiceModel.SR.SFxInvalidMessageBody, elementName, string.Empty, reader.NodeType, reader.Name, reader.NamespaceURI))); } } void VerifyIsStartElement(XmlDictionaryReader reader, XmlDictionaryString elementName, XmlDictionaryString elementNamespace) { bool foundElement = false; while (reader.IsStartElement()) { if (IsStartElement(reader, elementName, elementNamespace)) { foundElement = true; break; } else { OperationFormatter.TraceAndSkipElement(reader); } } if (!foundElement) { throw System.ServiceModel.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new SerializationException(System.ServiceModel.SR.GetString(System.ServiceModel.SR.SFxInvalidMessageBody, elementName, elementNamespace, reader.NodeType, reader.Name, reader.NamespaceURI))); } } void WriteVoidReturn(XmlDictionaryWriter writer) { writer.WriteStartElement(JsonGlobals.dString); writer.WriteAttributeString(JsonGlobals.typeString, JsonGlobals.nullString); writer.WriteEndElement(); } } }