using Sarand.BusinessMgr.Net.Standard.Base.Data; using Sarand.Net.Standard.Base.App; using Sarand.Net.Standard.Base.Core; using Sarand.Net.Standard.Base.Net; using Sarand.Net.Standard.Base.Utils; using System; using System.Collections.Generic; using System.Xml.Linq; namespace Sarand.BusinessMgr.Net.Standard.Base.WebService { //======================================================================= public class SbmWebServiceResponse { //------------------------------------------------------------------- // Definitions. //------------------------------------------------------------------- // Configuration. public class Config { public DateTime RequestStarted { get; set; } = DateTime.Now; public DateTime RequestCompleted { get; set; } public SacsHttpResponseData HttpResponseData { get; set; } } //------------------------------------------------------------------- // Data members. protected readonly Config config; //------------------------------------------------------------------- // Construction. public SbmWebServiceResponse(Config config) { this.config = config; ResponseData = SbmWindowsServiceCrypter.DecryptResponseData(config.HttpResponseData.Data); try { // Identify the response element in the xml data. ResponseDoc = XDocument.Parse(ResponseData, LoadOptions.None); XElement rootElement = ResponseDoc.Root; if (rootElement.Name.LocalName.EndsWithCI("Response")) ResponseElement = rootElement; else if (rootElement.Name.LocalName.EqualsCI(SacsSoapUtils.GetElementName(SoapElementType.Envelope))) { SoapEnvelope = true; SoapPrefix = rootElement.GetNamespacePrefix(); foreach (XElement soapElement in rootElement.Elements()) { if (soapElement.Name.LocalName.EqualsCI(SacsSoapUtils.GetElementName(SoapElementType.Body))) { foreach (XElement bodyElement in soapElement.Elements()) { if (bodyElement.Name.LocalName.EndsWithCI("Response")) { ResponseElement = bodyElement; } } } } } if (ResponseElement != null) { // Extract status code. XElement statusElement = ResponseElement.GetFirstChildElement(SbmWebServiceDfn.ElementName.Status); if (statusElement != null) { StatusCode = statusElement.GetAttributeValue(SbmWebServiceDfn.AttributeName.Code); // Extract messages. XElement messagesElement = statusElement.GetFirstChildElement(SbmWebServiceDfn.ElementName.Messages); if (messagesElement != null) { foreach (XElement messageElement in messagesElement.GetChildElements(SbmWebServiceDfn.ElementName.Message)) { String context = messageElement.GetAttributeValue(SbmWebServiceDfn.AttributeName.Context); String code = messageElement.GetAttributeValue(SbmWebServiceDfn.AttributeName.Code); SaMessageLevel level = SacsSystem.GetMessageLevelFromCode(messageElement.GetAttributeValue(SbmWebServiceDfn.AttributeName.Level)); SbmWebServiceMessage message = new SbmWebServiceMessage(context, code, messageElement.Value, level); Messages.Add(message); } } } } } catch (Exception) { } } public SbmWebServiceResponse(SbmWebServiceResponse serviceResponse) { // Copied from another service reponse - don't re-intrepert properties. this.config = serviceResponse.config; // Structure. SoapEnvelope = serviceResponse.SoapEnvelope; SoapPrefix = serviceResponse.SoapPrefix; // Response. ResponseData = serviceResponse.ResponseData; ResponseDoc = serviceResponse.ResponseDoc; ResponseElement = serviceResponse.ResponseElement; // Status. StatusCode = serviceResponse.StatusCode; Messages = serviceResponse.Messages; } //------------------------------------------------------------------- // Properties. public DateTime RequestStarted { get { return config.RequestStarted; } } public DateTime RequestCompleted { get { return config.RequestCompleted; } } public SacsHttpResponseData HttpResponseData { get { return config.HttpResponseData; } } // Structure. public bool SoapEnvelope { get; } public String SoapPrefix { get; } = ""; // Response. public String ResponseData { get; } public XDocument ResponseDoc { get; } public XElement ResponseElement { get; } // Status. public bool TaskCancelled { get; set; } public String StatusCode { get; } = ""; public List Messages { get; } = new List(); public String ErrorStateMessage { get; set; } //------------------------------------------------------------------- } //======================================================================= }