.NET Framework Bookmark and Share   
 index > ASMX Web Services and XML Serialization > Read encrypt soap message in BeforeDeserialize
 

Read encrypt soap message in BeforeDeserialize

I try read encrypt soap message in BeforeDeserialize and write soap message as string in txt files. But output is empty.

If I don't send encrypt soap message, I can read soap message stream and also output in txt file is correct.

Can somebody help me ? I don't know what is bad. I use TDES to encrypt and decrypt soap, message. But I want read encrypt message. Encrypt and Decrypt Soap message is correct. Only if I try read encrypt message stream and write in txt file, the output is empty...

private void CopyStream(Stream from, Stream to)
        {
            TextReader reader = new StreamReader(from);
            TextWriter writer = new StreamWriter(to);
            writer.Write(reader.ReadToEnd());
            writer.Flush();
        }

public override void ProcessMessage(SoapMessage message)
        {
            switch (message.Stage)
            {
                case SoapMessageStage.BeforeSerialize:
                    break;
                case SoapMessageStage.AfterSerialize:
                    EncryptXML();
                    break;
                case SoapMessageStage.BeforeDeserialize:
                    {
                        MemoryStream tempStream = new MemoryStream();
                        CopyStream(message.Stream, tempStream);
                        tempStream.Position = 0;

                        string a = Encoding.UTF8.GetString(tempStream.ToArray());

                        TextWriter tw = new StreamWriter("D:\\xml.txt");
                        tw.WriteLine(a);
                        tw.Close();
                        message.Stream.Position = 0;

                        DecryptXML();  
                    }
                    break;
                case SoapMessageStage.AfterDeserialize:
                    break;
                default:
                    throw new ArgumentException("Chyba pri serializacii SOAP msg.");
            }
        }

public void EncryptXML()
        {
            computeKeyAndIV();

            newStream.Position = 0;
            XmlTextReader reader = new XmlTextReader(newStream);
            XmlDocument doc = new XmlDocument();
            doc.Load(reader);
            XmlNamespaceManager nsMan = new XmlNamespaceManager(doc.NameTable);
            nsMan.AddNamespace("soap",
                "http://schemas.xmlsoap.org/soap/envelope/");

            foreach (string xPathQuery in soapElement)
            {
                XmlNodeList nodesToEncrypt =
                    doc.SelectNodes(xPathQuery, nsMan);
                foreach (XmlNode nodeToEncrypt in nodesToEncrypt)
                {
                    nodeToEncrypt.InnerXml =
                        EncryptString(nodeToEncrypt.InnerXml);
                }
            }
            newStream.Position = 0;
            XmlTextWriter writer = new XmlTextWriter(newStream, Encoding.UTF8);
            doc.Save(writer);

            newStream.Position = 0;
            CopyStream(newStream, oldStream);
        }


        public void DecryptXML()
        {
            computeKeyAndIV();

            MemoryStream tempStream = new MemoryStream();
            CopyStream(oldStream, tempStream);
            tempStream.Position = 0;
            XmlTextReader reader = new XmlTextReader(tempStream);
            XmlDocument doc = new XmlDocument();
            doc.Load(reader);
            XmlNamespaceManager nsMan = new XmlNamespaceManager(doc.NameTable);
            nsMan.AddNamespace("soap",
                "http://schemas.xmlsoap.org/soap/envelope/");

            foreach (string xPathQuery in soapElement)
            {
                XmlNodeList nodesToEncrypt =
                    doc.SelectNodes(xPathQuery, nsMan);
                foreach (XmlNode nodeToEncrypt in nodesToEncrypt)
                {
                    nodeToEncrypt.InnerXml =
                        DecryptString(nodeToEncrypt.InnerXml);
                }
            }
            tempStream = new MemoryStream();
            XmlTextWriter writer =
                new XmlTextWriter(tempStream, Encoding.UTF8);
            doc.Save(writer);
            tempStream.Position = 0;
            CopyStream(tempStream, newStream);
            newStream.Position = 0;
        }


        private string EncryptString(string _string)
        {
            MemoryStream encryptedStream = new MemoryStream();

            TripleDESCryptoServiceProvider encryptor = new TripleDESCryptoServiceProvider();
            CryptoStream encryptionStream = new CryptoStream(encryptedStream, encryptor.CreateEncryptor(key, iv), CryptoStreamMode.Write);

            byte[] sourceBytes = Encoding.UTF8.GetBytes(_string);
            encryptionStream.Write(sourceBytes, 0, sourceBytes.Length);
            encryptionStream.FlushFinalBlock();

            XmlSerializer serializer = new XmlSerializer(typeof(byte[]));
            StringBuilder sb = new StringBuilder();
            TextWriter writer = new StringWriter(sb);
            serializer.Serialize(writer, encryptedStream.ToArray());
            writer.Flush();

            XmlDocument doc = new XmlDocument();
            doc.LoadXml(sb.ToString());
            return doc.DocumentElement.InnerXml;
        }

        private string DecryptString(string _string)
        {
            _string =
                "<?xml version=\"1.0\" encoding=\"utf-16\"?><base64Binary>" +
                _string + "</base64Binary>";
            XmlSerializer deSerializer = new XmlSerializer(typeof(byte[]));
            TextReader reader = new StringReader(_string);
            byte[] sourceBytes = deSerializer.Deserialize(reader) as byte[];

            MemoryStream tempStream = new MemoryStream();

            TripleDESCryptoServiceProvider decryptor = new TripleDESCryptoServiceProvider();
            CryptoStream decryptionStream = new CryptoStream(tempStream, decryptor.CreateDecryptor(key, iv), CryptoStreamMode.Write);

            decryptionStream.Write(sourceBytes, 0, sourceBytes.Length);
            decryptionStream.FlushFinalBlock();
            return Encoding.UTF8.GetString(tempStream.ToArray());
        }


klerik123456
Solution is :

            MemoryStream tempStream = new MemoryStream();
            CopyStream(oldStream, tempStream);
            tempStream.Position = 0;
            string soapBodyString = Encoding.UTF8.GetString (tempStream.ToArray());
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(soapBodyString);
            doc.Save("D:\\soap.xml");
            oldStream.Position = 0;
klerik123456
Solution is :

            MemoryStream tempStream = new MemoryStream();
            CopyStream(oldStream, tempStream);
            tempStream.Position = 0;
            string soapBodyString = Encoding.UTF8.GetString (tempStream.ToArray());
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(soapBodyString);
            doc.Save("D:\\soap.xml");
            oldStream.Position = 0;
klerik123456

You can use google to search for other answers

Custom Search

More Threads

• datetime issue
• Web Service cannot handle multiple user cocurrently?
• Proxy class using Dataset instead of the complex type
• Webservice returns a 400:Bad Request
• Response is not well-formed XML
• Access to Direct3D under the IIS web server.
• 403 Forbidden error when searching UDDI directory - why?
• Sharing a type between client and web service
• IIS Problem
• Unable to cast object of type 'System.Security.Principal.GenericIdentity' to type 'System.Web.Security.FormsIdentity'