Как кодировать XML в base64, а затем сохранить его в поток? - PullRequest
1 голос
/ 05 ноября 2019

Задача - отправить HTTP web request вместе с Soap Envelope, которые должны быть преобразованы в base64.

К сожалению, я не могу преобразовать Envelope в base64, потому что мой метод InsertSoapEnvelopeIntoWebRequest использует XML и сохраняет его в stream, как показано ниже. Мне нужно следовать этой структуре для запроса на работу.

    XmlDocument soapEnvelopeXml = CreateSoapEnvelope(attachmentName);
    HttpWebRequest webRequest = CreateWebRequest(url, action, attachmentName);
    InsertSoapEnvelopeIntoWebRequest(soapEnvelopeXml, webRequest);

    private static XmlDocument CreateSoapEnvelope(string attachmentName)
    {
        //Convert name to base64
        var fileNameEncoded = EncodeStringToBase64(attachmentName);
        var authorizationIdEncoded = EncodeStringToBase64("C61582-B73K47EJ54");
        var authorizationKeyEncoded = EncodeStringToBase64("TWTXBP-HNEZ9J-74EV8Z-QM5J9T");
        XmlDocument soapEnvelopeDocument = new XmlDocument();
        soapEnvelopeDocument.LoadXml($@"<?xml version=""1.0"" encoding=""UTF-8""?><SOAP-ENV:Envelope xmlns:SOAP-ENV=""http://schemas.xmlsoap.org/soap/envelope/"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns:SOAP-ENC=""http://schemas.xmlsoap.org/soap/encoding/"" SOAP-ENV:encodingStyle=""http://schemas.xmlsoap.org/soap/encoding/"" xmlns:ns4=""https://efaktura.bg/soap/""><SOAP-ENV:Body><ns4:uploadFile><ns4:authorizationId>{authorizationIdEncoded}</ns4:authorizationId><ns4:authorizationKey>{authorizationKeyEncoded}</ns4:authorizationKey><ns4:fileName>{fileNameEncoded}</ns4:fileName></ns4:uploadFile></SOAP-ENV:Body></SOAP-ENV:Envelope>");
    //            doc.LoadXml(soapRequest.ToString());
        return soapEnvelopeDocument;
    }
    public static string EncodeStringToBase64(string plainTextBytes)
    {
        var plainText = System.Text.Encoding.UTF8.GetBytes(plainTextBytes);

        return System.Convert.ToBase64String(plainText);
    }

    private static void InsertSoapEnvelopeIntoWebRequest(XmlDocument soapEnvelopeXml, HttpWebRequest webRequest)
    {
        using (Stream stream = webRequest.GetRequestStream())
        {
            soapEnvelopeXml.Save(stream);
        }
    }

Я пытался преобразовать XML в String, но в CreateSoapEnvelope у меня есть метод LoadXML, и если это base64, метод не может прочитать его, потому что этоне в формате XML.

Если я выполню преобразование в InsertSoapEnvelopeIntoWebRequest, я не смогу использовать soapEnvelopeXml.Save(stream)

Где и как я могу выполнить преобразование?

1 Ответ

0 голосов
/ 05 ноября 2019

Измените свой метод InsertSoapEnvelope на этот:

    private static void InsertSoapEnvelopeIntoWebRequest(XmlDocument soapEnvelopeXml, HttpWebRequest webRequest)
    {
        using (Stream stream = webRequest.GetRequestStream())
        {
            StringWriter sw = new StringWriter();
            XmlTextWriter tx = new XmlTextWriter(sw);
            soapEnvelopeXml.WriteTo(tx);

            string str = sw.ToString();

            Console.WriteLine(soapEnvelopeXml.ToString());
            ASCIIEncoding Encode = new ASCIIEncoding();
            var arr = Encode.GetBytes(EncodeStringToBase64(str));
            stream.Write(arr, 0, arr.Length);
        }
    }

Если вы Console.Writeline XML.ToString(), он даст вам ссылку. Идея состоит в том, чтобы записать XML в TextWriter, который использует StringWriter. Как только вы сделали это, вы должны сначала encode, а затем преобразовать его в byte array. Это просто вопрос записи в поток. в качестве параметров вы указываете массив, смещение 0 и длину байтового массива.

...