Я использую XmlReader для анализа XML-документа. Один из узлов содержит данные, закодированные в base64, и я хочу их декодировать. Это то, что я делаю:Файл всегда пуст, если я использую ReadElementContentAsBase64
byte[] buffer = new byte[4096];
int readBytes = 0;
using (FileStream outputFile = File.OpenWrite (path))
using (BinaryWriter bw = new BinaryWriter (outputFile)) {
while ((readBytes = reader.ReadElementContentAsBase64 (buffer, 0, 4096)) > 0) {
bw.Write (buffer, 0, readBytes);
}
}
Но файл пуст и имеет размер файла 0 kB. Я также пробовал это без успеха:
byte[] buffer = new byte[4096];
int readBytes = 0;
FileStream outputFile = new FileStream (path, FileMode.OpenOrCreate, FileAccess.Write, FileShare.Write);
BinaryWriter bw = new BinaryWriter (outputFile);
while ((readBytes = reader.ReadElementContentAsBase64 (buffer, 0, 4096)) > 0) {
bw.Write (buffer, 0, readBytes);
}
outputFile.Close();
Я не понимаю. readBytes не пуст, поэтому данные здесь. Если я временно сохраняю поток как файл и convert, тогда он работает (поэтому я не использую ReadElementContentAsBase64
). Я использую Xamarin Studio на Mac для этого, и этот код встроен в dll.
Я делаю что-то неправильно или это ошибка? У меня была проблема, что decoding doesn't work correctly, но пустой файл? Что может быть причиной этого? Что я могу проверить?
Edit:
Теперь я попробовал без BinaryWriter
, но файл имеет еще размер 0 Кб. Здесь вы можете увидеть реализацию с читателя:
public async string CallWS(string path, CancellationToken cancelToken)
{
XmlDocument soapEnvelop = new XmlDocument();
soapEnvelop.LoadXml(someXMLDoc);
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(webserviceAddress);
webRequest.Headers.Add("SOAPAction", "http://schemas.xmlsoap.org/soap/envelope");
webRequest.ContentType = "text/xml;charset=\"utf-8\"";
webRequest.Accept = "text/xml";
webRequest.Method = "POST";
using (Stream stream = webrequest.GetRequestStream())
{
soapEnvelop.Save(stream);
}
using (var response = await webRequest.GetResponseAsync())
using (Stream stream = response.GetResponseStream())
return parser.GetDocument(stream, path);
}
public string GetDocument(Stream stream, string path)
{
// read xml and save file
using (XmlReader reader = XmlReader.Create(stream))
{
while (reader.Read())
{
if (reader.IsStartElement() && reader.NodeType == XmlNodeType.Element)
{
switch (reader.Name)
{
case "Document":
reader.ReadToDescendant("cKey");
string ckey = reader.ReadInnerXml();
switch (ckey)
{
case "base64Content":
reader.ReadToNextSibling("cValue");
byte[] buffer = new byte[4096];
int readBytes = 0;
using (FileStream outputFile = File.OpenWrite(path))
{
while ((readBytes = reader.ReadElementContentAsBase64(buffer, 0, 4096)) > 0)
{
outputFile.Write(buffer, 0, readBytes);
}
}
break;
default:
break;
}
break;
default:
break;
}
}
}
}
return path;
}
Мы понятия не имеем, откуда берется «читатель». Пожалуйста, покажите короткую, но полную программу, демонстрирующую проблему, имея в виду, что нам действительно не нужно видеть, что вы делаете * с результатами, за исключением того, что они максимально точно показывают их правильность. –
Кроме того, непонятно, почему вы используете 'BinaryWriter' вообще ... почему бы просто не написать в поток? –
Я использовал 'BinaryWriter', потому что он был в [example] (https://msdn.microsoft.com/en-us/library/system.xml.xmlreader.readelementcontentasbase64%28v=vs.110%29.aspx) , Я обновил свой вопрос, чтобы показать вам * читателя *. Я получаю поток в эту функцию. Если вам нужно, я могу показать некоторые подробности о потоке. Спасибо за вашу помощь! – testing