由于 Base64 编码字符串太大,无法验证 XML

Posted

技术标签:

【中文标题】由于 Base64 编码字符串太大,无法验证 XML【英文标题】:XML cannot be validated because of too big Base64 encoded string 【发布时间】:2021-01-08 17:20:14 【问题描述】:

我在使用 .NET 4.0 框架编译的 Visual Studio 2017 中使用 C# 创建了一个 SOAP 服务。

我在调试时将服务部署到 IIS Express 和 IIS 管理器站点。 在这两种服务上,当我发布一个包含 810 万个字符的(大)Base64 编码字符串(一个 PDF 文件)的 XML 时,我都遇到了以下错误:

System.Web.Services.Protocols.SoapException: 服务器无法处理请求。 对象引用未设置为对象的实例。 在 System.Web.Services.Protocols.SoapServerProtocolHelper.GetRequestElement() 在 System.Web.Services.Protocols.Soap12ServerProtocolHelper.RouteRequest() 在 System.Web.Services.Protocols.SoapServerProtocol.Initialize() 在 System.Web.Services.Protocols.ServerProtocolFactory.Create(类型类型、HttpContext 上下文、HttpRequest 请求、HttpResponse 响应、Boolean& abortProcessing)

我已经尝试将web.config 文件和applicationhost.config 文件中的“最大允许内容长度”增加到大约3GB。这没有影响,但我也没想到会有任何结果,因为错误实际上并没有说明它有内容太大的问题。

当我使用另一个小得多的 Base64 字符串发布相同的 XML 时,它确实从 XML 中创建了一个正确的对象,没有任何问题。

我还通过多个在线转换器检查了 Base64 字符串是否正确。他们的大小也有很多问题,但我可以确认字符串。

奇怪的是,调试的时候甚至没有进入WebService类。

顺便说一句,代码中的字段是字节数组,在 XSD 中定义为 base64Binary。

我不能共享 Base64 字符串本身,因为在这种情况下它包含敏感信息,而且还因为它的大小。

我该如何解决这个问题?

更新 还尝试设置“为网站和项目使用 64 位版本的 IIS Express”,但这并没有帮助。

【问题讨论】:

请出示相关代码。 @itsme86 没有相关代码,因为正如我在调试时所说,它甚至没有进入 WebService 类,并且使用较小的 Base64 字符串它会进入并且一切正常。 如果没有代码,您能否至少edit 分享异常的完整ToString() 输出,包括异常类型、消息、回溯和内部异常(如果有) ? 在使用反序列化之前,您首先必须解码 base 64 字符串。编写自己的代码进行反序列化。大小应该是您自己的代码中的一个因素。见维基:en.wikibooks.org/wiki/Algorithm_Implementation/Miscellaneous/… 没有minimal reproducible example 我只能猜测这可能会有所帮助:IIS Express - increase memory limit。 【参考方案1】:

问题是最大请求长度。 XML 的大小比 IIS 中设置的默认限制长。这导致切割 XML,从而导致 XML 文件无效/不完整。

可以直接在 web.config 文件中更改此配置:

<system.web>        
   <httpRuntime maxRequestLength="2147483647" />
</system.web>

或在 IIS 管理器中:

    打开网站 打开配置编辑器 在该部分中转到 system.web/httpRuntime 更改 maxRequestLength 属性

【讨论】:

以上是关于由于 Base64 编码字符串太大,无法验证 XML的主要内容,如果未能解决你的问题,请参考以下文章

在 NodeJs 中解码 base64 编码的 webm 视频

golang包快速生成base64验证码

关于字符,字节与base64编码的理解

iOS上的Base64编码最后缺少填充

将Base64解码为UTF-8而不是单字节编码文本

NSData 不接受有效的 base64 编码字符串