2016-12-28 3 views
0

В моей WCF форматировщиком, у меня есть Base64 Содержимое обернутый в XML-элемент <Binary>...</Binary>Ошибка XmlReader.ReadContentAsBase64(). Ожидаемые данные в кодировке Base64. Найдено Концевой элемент

Мой код:

bodyReader.ReadFullStartElement("Binary"); 
byte[] rawBody = bodyReader.ReadContentAsBase64(); 

терпит неудачу с Exception:
«System.Xml.XmlException: Base64 кодированные данные ожидалось. Найдено Концевой элемент '' из пространства имен ''.

Чтобы быть точным 'bodyReader' является XmlDictionaryReader.
ReadContentAsBase64() @ MSDN
ReadFullStartElement() @MSDN

Удивительно, но следующий обходной работы:

bodyReader.ReadFullStartElement("Binary"); 
string b64 = bodyReader.ReadContentAsString(); 
rawBody = Convert.FromBase64String(b64); 

хотя это Обходной путь хорошо для меня,
Я хотел бы знать, что я делаю неправильно?

Edit:

Попробовал воспроизвести на минимальный примере, хотя в следующем примере ошибки
Примечания: строка Base64 является один неисправной на DispatchFormatter

private void TestXmlDictionaryReader() 
    { 
     string base64 = @"ewpjbGFzc05hbWU6ICJFYmF5IiwKc2hvcE5hbWU6ICJUb21lclNCIgp2YWx1ZTo1Cn0="; 
     string s = @"<Binary>ewpjbGFzc05hbWU6ICJFYmF5IiwKc2hvcE5hbWU6ICJUb21lclNCIgp2YWx1ZTo1Cn0=</Binary>"; 
     StringReader sr = new StringReader(s); 
     var xr = XmlReader.Create(sr); 
     var xmlDictRdr = XmlDictionaryReader.CreateDictionaryReader(xr); 
     xr.ReadStartElement("Binary"); 
     byte[] buff = new byte[5000]; 
     xr.ReadContentAsBase64(buff, 0, 0); 
    } 

2 вещи, ReadContentAsBase64 подпись отличается.

Minimal воспроизводимого Пример , потому что она не работает как простой метод, я создал базовый проект WCF с моим (Crippled) диспетчерским форматировщиком: Here on my GoogleDrive

Места Breakpoint @NewtonsoftJsonDispatchFormatter.cs линия 42.

42: var bodyReader = message.GetReaderAtBodyContents(); 
43: bodyReader.ReadStartElement("Binary"); 
44: byte[] rawBody = bodyReader.ReadContentAsBase64(); 

использовать любой метод для отправки запроса POST к вашим услугам:

POST /Service1.svc/GetData HTTP/1.1 
Host: localhost:1227 
Cache-Control: no-cache 
Postman-Token: 6d7141b8-c6c8-a9c1-f669-06c3c0ccd5e2 

{ 
    className: "Ebay", 
    shopName: "TomerSB" 
    value:5 
} 
+0

Не существует метода 'ReadFullStartElement' метода [' XmlReader'] (https://msdn.microsoft.com/en-us/library/system.xml.xmlreader (v = vs.110) .aspx). Кроме того, ['ReadContentAsBase64'] (https://msdn.microsoft.com/en-us/library/system.xml.xmlreader.readcontentasbase64 (v = vs.110) .aspx) имеет аргументы. Можете ли вы предоставить [mcve] для своей проблемы? – dbc

+0

Сделаю, как только я доберусь до своего компьютера. –

+1

Я не могу воспроизвести проблему. Вот [скрипка] (https://dotnetfiddle.net/AfbvfE), показывающая мою попытку. Обратите внимание, что скрипта не компилируется, потому что dotnetfiddle не ссылается в DLL, которая содержит 'XmlDictionaryReader', но если вы запустите код в VIsual Studio, вы увидите, что тестовый код успешно пройдет. Можете ли вы предоставить полный [mcve], включая XML? – dbc

ответ

0

Я не уверен, но я предполагаю, что контроллер API будет сериализовать строку как литерал строки XML, что приведет к тому, что строка будет заключена в двойные кавычки и вызовет любые другие специальные символы внутри строки, которые будут экранированы с помощью обратного слэша. поэтому, когда вы пытаетесь преобразовать его в массив байтов, он выдает исключение.

Смежные вопросы