protected override void ReadXml(XmlReader reader) { base.ReadXml(reader); reader.EnsureIsStartElement(); //read to method node //reader.ReadStartElement(); m_operation = reader.LocalName; m_operationNS = reader.NamespaceURI; m_argsXml = reader.ReadOuterXml(); foreach (SoapHeader h in Headers) { if (String.Compare(h.HeaderNamespace, SoapConstant.SoapAddressingNS, StringComparison.OrdinalIgnoreCase) == 0) { if (h.Name == SoapConstant.SoapHeaderActionLocalName) { m_actionAddress = h.Value.ToString(); } else if (h.Name == SoapConstant.SoapHeaderToLocalName) { m_toAddress = h.Value.ToString(); } } } if (String.IsNullOrEmpty(m_actionAddress)) { throw new ArgumentException("Miss Action address", "reader"); } if (String.IsNullOrEmpty(m_toAddress)) { throw new ArgumentException("Miss To address", "reader"); } }
//public static SoapReturnMessage Create(string actionName, object result, Dictionary<string, object> outArgs, SoapHeader[] headers=null) //{ // SoapReturnMessage message = new SoapReturnMessage(); // if (headers != null) // { // foreach (SoapHeader header in headers) // { // message.AddHeader(header); // } // } // message.m_action = actionName; // message.m_result = result; // message.m_outArgs = outArgs; // return message; //} //public object ReadResult(MethodInfo method) //{ // // read to [Action]Result node // XmlReader resultReader = m_responseReader.ReadSubtree(); // resultReader.ReadStartElement(); // if (!resultReader.IsStartElement()) // { // throw new SerializationException("Message invalid!"); // } // Type returnType = method.ReturnType; // //TODO: check void // return SoapSerializeHelper.ReadDataContract(resultReader, returnType); //} //public IReadOnlyDictionary<string, object> GetOutArgs(MethodInfo methodInfo) //{ // if (m_outArgs != null) // { // return new ReadOnlyDictionary<string, object>(m_outArgs); // } // return null; //} //public object ActionName //{ // get // { // return m_action; // } //} protected override void ReadXml(XmlReader reader) { base.ReadXml(reader); reader.EnsureIsStartElement(); m_actionResponseName = reader.LocalName; m_serviceNS = reader.NamespaceURI; reader.ReadStartElement(); if (reader.LocalName.EndsWith(SoapConstant.ActionResponseResultSuffix)) { //m_result = SoapSerializeHelper.ReadDataContract(reader.ReadSubtree(), typeof( } string responseName = m_operationName + SoapConstant.ActionResponseNameSuffix; string resultName = m_operationName + SoapConstant.ActionResponseResultSuffix; //if (!reader.ReadToDescendant(SoapConstrant.SoapBodyLocalName, SoapConstrant.SoapNS)) //{ // throw new SerializationException("reader"); //} ////read to method node //reader.ReadStartElement(); //m_action = reader.LocalName; //if (m_action.EndsWith(SoapConstrant.ActionResponseSuffix)) //{ // m_action = m_action.Substring(0, m_action.Length - SoapConstrant.ActionResponseSuffix.Length); //} //m_responseReader = reader.ReadSubtree(); }
//public SoapCallMessage(XmlReader reader) //{ // ReadXml(reader); //} public object[] GetInArgs(MethodInfo method) { if (m_args == null) { Log.Default.Trace(string.Format(">>Create:{0}", method.Name)); StringReader stringReader = new StringReader(m_argsXml); XmlReader argsReader = XmlReader.Create(stringReader); argsReader.EnsureIsStartElement(); ParameterInfo[] paramsInfo = method.GetParameters(); object[] args = new object[paramsInfo.Length]; argsReader.ReadStartElement(); while (argsReader.IsStartElement()) { string argName = argsReader.LocalName; Log.Default.Trace(string.Format(">>argName:{0}", argName)); int i = 0; ParameterInfo pInfo = null; for (; i < paramsInfo.Length; i++) { if (paramsInfo[i].Name == argName) { pInfo = paramsInfo[i]; break; } } if (pInfo == null) { throw new Exception("pInfo is null!"); } if (!pInfo.IsOut) { Type type = pInfo.ParameterType; Log.Default.Trace(">>type:{0}", type.Name); if (type.HasElementType) { Log.Default.Trace(">>HasElementType"); //type = type.GetElementType(); Log.Default.Trace(">>el type:{0}", type.Name); } args[i] = SoapSerializeHelper.ReadDataContract(argsReader, type); } else { argsReader.ReadStartElement(); } } m_args = args; } return(m_args); }
protected virtual void ReadXml(XmlReader reader) { reader.EnsureIsStartElement(); Name = reader.LocalName; HeaderNamespace = reader.NamespaceURI; string mustUnderstand = reader.GetAttribute(SoapConstant.SoapHeaderMustUnderstandLocalName, SoapConstant.EnvelopeNS); if (!String.IsNullOrEmpty(mustUnderstand)) { MustUnderstand = mustUnderstand == "1" ? true : false; } Value = reader.ReadInnerXml(); //reader.ReadStartElement(); }
protected virtual void ReadXml(XmlReader reader) { reader.EnsureIsStartElement(); m_envelopeNS = reader.NamespaceURI; if (reader.LocalName != SoapConstant.EnvelopeLocalName) { throw new ArgumentException("Soap message should start with " + SoapConstant.EnvelopeLocalName + "!"); } //read to Header or body reader.ReadStartElement(); if (reader.LocalName == SoapConstant.SoapHeaderLocalName && reader.NamespaceURI == m_envelopeNS) { //header XmlReader headerReader = reader.ReadSubtree(); headerReader.ReadStartElement(); while (headerReader.IsStartElement()) { XmlReader hdrReader = headerReader.ReadSubtree(); //string headerXml = reader.readsReadOuterXml(); SoapHeader header = SoapHeader.Deserialize(hdrReader); m_headers.Add(header); headerReader.ReadEndElement(); //hdrReader = reader.ReadSubtree(); } //end header and move to body //if header is empty if (reader.IsStartElement()) { reader.ReadStartElement(); } else { reader.ReadEndElement(); } } if (reader.LocalName != SoapConstant.SoapBodyLocalName || reader.NamespaceURI != m_envelopeNS) { throw new ArgumentException("Miss body element!", "reader"); } reader.ReadStartElement(); }
protected override void ReadXml(XmlReader reader) { base.ReadXml(reader); reader.EnsureIsStartElement(); //fault //if (reader.LocalName != SoapConstant.SoapFaultLocalName && String.Compare(reader.NamespaceURI, EnvelopeNS) != 0) //{ // throw new ArgumentException("Miss Fault element!", "reader"); //} //to Code reader.ReadStartElement(SoapConstant.SoapFaultLocalName, EnvelopeNS); //to Code Value reader.ReadStartElement(SoapConstant.SoapCodeLocalName, EnvelopeNS); //to Code Value Content reader.ReadStartElement(SoapConstant.SoapCodeValueLocalName, EnvelopeNS); string valueString = reader.ReadContentAsString(); FaultCode = GetCodeValue(valueString); reader.ReadEndElement(); reader.ReadEndElement(); //reason reader.ReadStartElement(SoapConstant.SoapReasonLocalName, EnvelopeNS); reader.ReadStartElement(SoapConstant.SoapReasonTextLocalName, EnvelopeNS); Reason = reader.ReadContentAsString(); reader.ReadEndElement(); reader.ReadEndElement(); //detail reader.ReadStartElement(SoapConstant.SoapDetailLocalName, EnvelopeNS); Detail = reader.ReadInnerXml(); reader.ReadEndElement(); //end fault reader.ReadEndElement(); //end body reader.ReadEndElement(); //end envelope reader.ReadEndElement(); }