由于 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的主要内容,如果未能解决你的问题,请参考以下文章