XmlReader.ReadContentAsBase64()失败。期望Base64编码数据。找到最终元素

时间:2016-12-28 11:31:49

标签: c# xml wcf base64 xmlreader

在我的WCF格式化程序中,我有一个Base64内容包装在XML元素<Binary>...</Binary>

我的代码:

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

因例外而失败:
“System.Xml.XmlException:期望的Base64编码数据。找到命名空间中的结束元素'。

确切地说,'bodyReader'是一个XmlDictionaryReader ReadContentAsBase64() @ MSDN
ReadFullStartElement() @MSDN

令人惊讶的是,以下解决方法有效:

bodyReader.ReadFullStartElement("Binary");
string b64 = bodyReader.ReadContentAsString();
rawBody = Convert.FromBase64String(b64);
但是,这个解决方法对我来说没问题,
我想知道我做错了什么?

修改

尝试重现最小的例子,尽管下面的例子失败了 注意: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);
    }

第二件事,ReadContentAsBase64签名不同。

最小可重现性示例 因为它不是一个简单的方法, 我用我的(Crippled)Dispatch格式化程序创建了一个基本的WCF项目:Here on my GoogleDrive

放置断点@ 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
}

1 个答案:

答案 0 :(得分:0)

我不确定,但我想API控制器会将字符串序列化为XML字符串文字,这会导致字符串被双引号括起来并导致字符串中的任何其他特殊字符转义为反斜杠。因此,当您尝试将其转换为字节数组时,它会抛出异常。