/// <summary>
        /// WS-Adressing headers are not required in responses according to the WS-Addressing specification. E.g. does WCF not automatically include a MessageId in responses.
        /// Therefore this extra validation has been made on top of WCF in order to always ensure that the WS-Addressing headers specified by [OIO IDWS SOAP 1.1] are present.
        /// </summary>
        /// <param name="message">The message in which the headers must be.</param>
        private static void ValidateWsAddressingHeadersCommon(Message message)
        {
            var messageIdHeader =
                message.Headers.SingleOrDefault(
                    x =>
                    WsAdressing.WsAdressingMessageId == x.Name &&
                    WsAdressing.WsAdressing10NameSpace == x.Namespace);

            if (messageIdHeader == null)
            {
                const string errorMessage = "WS-Adressing MessageID header was not present";
                Logger.Instance.Error(errorMessage);
                SoapFaults.CreateClientSoapFault(errorMessage);
            }

            //var actionHeader =
            //    message.Headers.SingleOrDefault(
            //        x =>
            //            WsAdressing.WsAdressingAction == x.Name &&
            //            WsAdressing.WsAdressing10NameSpace == x.Namespace);

            //if (actionHeader == null)
            //{
            //    const string errorMessage = "WS-Adressing Action header was not present";
            //    Logger.Instance.Error(errorMessage);
            //    throw new FaultException(SoapFaults.CreateClientSoapFault(errorMessage));
            //}
        }
        private static void ValidateWsAddressingHeadersRecievedFromWsp(Message message)
        {
            // First do the client validation which is common for both server and client.
            ValidateWsAddressingHeadersCommon(message);

            var relatesToHeader =
                message.Headers.SingleOrDefault(
                    x =>
                    WsAdressing.WsAdressingRelatesTo == x.Name &&
                    WsAdressing.WsAdressing10NameSpace == x.Namespace);

            if (relatesToHeader == null)
            {
                var errorMessage = "WS-Adressing RelatesTo header was not present";
                Logger.Instance.Error(errorMessage);
                throw new FaultException(SoapFaults.CreateClientSoapFault(errorMessage));
            }
        }
        private static void ValidateLibertyBasicFrameworkHeader(Message message)
        {
            var headerPosition = message.Headers.FindHeader(Common.Constants.LibBas.HeaderName, Common.Constants.LibBas.HeaderNameSpace);

            if (headerPosition == -1)
            {
                var errorMessage = string.Format(
                    "The liberty basic framework header was not present. SOAP header with name '{0}' and namespace '{1}' was expected!",
                    Common.Constants.LibBas.HeaderName, Common.Constants.LibBas.HeaderNameSpace);
                Logger.Instance.Error(errorMessage);

                // TODO: once the issue with the liberty framework header is solved, make the sugested modifications bellow
                //return; //  remove return; and add throw new FaultException(SoapFaults.CreateLibBasFrameWorkMisMatchSoapFault(errorMessage));
                throw new FaultException(SoapFaults.CreateLibBasFrameWorkMisMatchSoapFault(errorMessage));
            }
            var content = message.Headers.GetHeader <XmlNode[]>(headerPosition);

            // Check that it is the correct profile
            var profileAttribute = content.Cast <XmlAttribute>()
                                   .SingleOrDefault(
                x =>
                Common.Constants.LibBas.ProfileName == x.LocalName && Common.Constants.LibBas.ProfileNameSpace == x.NamespaceURI);

            if (profileAttribute == null)
            {
                var errorMessage = string.Format("Attribute with name '{0}' in namespace '{1}' was not present in the liberty basic framework header.", Common.Constants.LibBas.ProfileName, Common.Constants.LibBas.ProfileNameSpace);
                Logger.Instance.Error(errorMessage);
                throw new FaultException(SoapFaults.CreateLibBasFrameWorkMisMatchSoapFault(errorMessage));
            }
            if (Common.Constants.LibBas.ProfileValue != profileAttribute.Value)
            {
                var errorMessage = string.Format("Profile name did not match in the liberty basic framework header. Value must be: '{0}' and value was: '{1}'.", Common.Constants.LibBas.ProfileValue, profileAttribute.Value);
                Logger.Instance.Error(errorMessage);
                throw new FaultException(SoapFaults.CreateLibBasFrameWorkMisMatchSoapFault(errorMessage));
            }

            // Check that it is the correct version of the profile
            var versionAttribute = content.Cast <XmlAttribute>()
                                   .SingleOrDefault(
                x =>
                Common.Constants.LibBas.VersionName == x.LocalName && string.Empty == x.NamespaceURI);

            if (versionAttribute == null)
            {
                var errorMessage = string.Format("Attribute with name '{0}' in the empty namespace was not present in the liberty basic framework header.", Common.Constants.LibBas.VersionName);
                Logger.Instance.Error(errorMessage);
                throw new FaultException(SoapFaults.CreateLibBasFrameWorkMisMatchSoapFault(errorMessage));
            }
            if (Common.Constants.LibBas.VersionValue != versionAttribute.Value)
            {
                var errorMessage = string.Format("Version did not match in the liberty basic framework header. Value should be: '{0}' and value was: '{1}'.", Common.Constants.LibBas.VersionValue, versionAttribute.Value);
                Logger.Instance.Error(errorMessage);
                throw new FaultException(SoapFaults.CreateLibBasFrameWorkMisMatchSoapFault(errorMessage));
            }

            // Security header element is marked with the MustUnderstand attribute. Hence, we need to inform the WCF framework that this header element has been taken care of.
            var frameworkHeader =
                message.Headers.Single(
                    x =>
                    Common.Constants.LibBas.HeaderName == x.Name &&
                    Common.Constants.LibBas.HeaderNameSpace == x.Namespace);

            Logger.Instance.Trace("Letting WCF know that liberty framework header has been processed.");
            message.Headers.UnderstoodHeaders.Add(frameworkHeader);
        }