Encoding w xml webservice

0

Dzien dobry,

Mam maly problem z Encoding utf-8/utf-16. Program wysyla xml request do webservisu, gdzie encoding musi byc utf-8.
Problem jest maly bo proteza dzial, tylko wyglada tak jak.... proteza ;)
```csharp
var soapEnvelope = XDocument.Parse(template);
soapEnvelope.Declaration = new XDeclaration("1.0", "utf-8", null);
var contentElement = soapEnvelope.Root.Elements()
.FirstOrDefault(el => el.Name.LocalName == "Body")?.Elements()
.FirstOrDefault(el => el.Name.LocalName == "getmsg")?.Elements()
.FirstOrDefault(el => el.Name.LocalName == "name");
contentElement.Value = StationName;
string requestBody;
var writer = new StringWriter();
soapEnvelope.Save(writer);
requestBody = writer.ToString();
requestBody = requestBody.Replace("utf-16", "utf-8"); //proteza

Do "template" wczytywany jest request z pliku. W template ciagle encoding jest utf-8
```xml
@"<?xml version=""1.0"" encoding=""UTF-8"" ?>

Po zapisaniu do "writer", encoding zmienia sie na utf-16

soapEnvelope.Save(writer);

Jak zapisac do "writer" of razu z Encoding=utf8? Jakies parametry trzeba ustawic?
Proteza niby dziala, ale jakos to tak malo elegncko wyglada ;)
Jakby ktos mial rozwiazanie przed dlugim weekendem to bylbym wdzieczny :).

No I milego weekend zycze!!

Pozdrawiam Usjwo

0

Zacznij od małego pliku:

namespace Sample
{
    using System.IO;
    using System.Text;

    internal sealed class Utf8StringWriter : StringWriter
    {
        public override Encoding Encoding => Encoding.UTF8;
    }

    internal static class XmlDocumentExtensions
    {
        internal static string ExportToString(this XmlDocument source)
        {
            var stringWriter = new Utf8StringWriter();
            using (XmlWriter xmlTextWriter = XmlWriter.Create(
                stringWriter,
                new XmlWriterSettings
                {
                    Indent = true
                }))
            {
                source.WriteTo(xmlTextWriter);
                xmlTextWriter.Flush();

                return stringWriter.GetStringBuilder().ToString();
            }
        }
    }
}

A teraz chyba już wiesz jak dalej z tym działać, poza tym chyba lepiej tutaj używać serializacji zamiast ręcznego tworzenia zapytania.

Pozdrawiam,

mr-owl

0
mr-owl napisał(a):

Zacznij od małego pliku:

Dzieki. Takie rozwiazanie z claas Utf8StringWriter jest olecane w internetach. Myslalem ze jest jakies prostsze rozwiazanie.
Czy oznacza to ze class StringWriter zawsze ma utf-16?
Z drugiej strony zastanawiam sie czy silowa zamiana (moja proteza) nie bedzie bardziej zrozumiala dla laika w C#?

1 użytkowników online, w tym zalogowanych: 0, gości: 1