Zbieramy wiele ciągów i wysyłamy je do naszych klientów w fragmentach xml. Łańcuchy te mogą zawierać dosłownie dowolną postać. Pojawił się błąd spowodowany przez serializację wystąpień XElement, które zawierają "złe" znaki. Oto przykład:Obróbka ciągów do wstawienia do XElement
var message = new XElement("song");
char c = (char)0x1a; //sub
var someData = string.Format("some{0}stuff", c);
var attr = new XAttribute("someAttr", someData);
message.Add(attr);
string msgStr = message.ToString(SaveOptions.DisableFormatting); //exception here
Kod powyżej wytwarza wyjątek przy wskazanym linią. Oto StackTrace:
'SUB', hexadecimal value 0x1A, is an invalid character. System.ArgumentException System.ArgumentException: '', hexadecimal value 0x1A, is an invalid character. at System.Xml.XmlEncodedRawTextWriter.InvalidXmlChar(Int32 ch, Char* pDst, Boolean entitize) at System.Xml.XmlEncodedRawTextWriter.WriteAttributeTextBlock(Char* pSrc, Char* pSrcEnd) at System.Xml.XmlEncodedRawTextWriter.WriteString(String text) at System.Xml.XmlWellFormedWriter.WriteString(String text) at System.Xml.XmlWriter.WriteAttributeString(String prefix, String localName, String ns, String value) at System.Xml.Linq.ElementWriter.WriteStartElement(XElement e) at System.Xml.Linq.ElementWriter.WriteElement(XElement e) at System.Xml.Linq.XElement.WriteTo(XmlWriter writer) at System.Xml.Linq.XNode.GetXmlString(SaveOptions o)
Podejrzewam, że nie jest to poprawne zachowanie i złe char należy uciekł do XML. Czy jest to pożądane, czy nie, jest pytanie, na które odpowiem później.
Więc oto pytanie:
Czy jest jakiś sposób leczenia sznurki tak, że ten błąd może nie wystąpić, czy mam po prostu rozebrać wszystkie znaki poniżej char 0x20
i krzyż palcami?
Dobre pytanie. Właściwie nie powinieneś rozbierać * wszystkich * znaków poniżej 0x20, ponieważ niektóre z nich są odpowiednio chronione (np. CR, LF, TAB ...). Ale nie widzę żadnego powodu, dla którego inni nie uciekną ... –
Czy twoi klienci kiedykolwiek będą potrzebować tych znaków w strunach? – climbage
Nie. Zdecydowanie nie. Są one renderowane do pola tekstowego WPF lub jako mvcstring w aplikacji internetowej. W rzeczywistości w naszym przypadku nawet kombinacje cr/lf/tab @ThomasLevesque mogą zostać usunięte, ponieważ oczekujemy jednej linii. Te ciągi stanowią dość podróż do naszych serwerów za pomocą tagów idv3, oprogramowania do emisji i serwerów shoutcast. Jest całkiem możliwe, że kodowanie zostało zmanipulowane po drodze. Uważam, że moja poprawka jest całkowicie dla nas odpowiednia. Nadal jestem zdezorientowany tym wyjątkiem i chciałbym potwierdzić, że prawdopodobnie zauważyłem błąd w .net. – spender