.NET MAUI解码WebService Base64响应失败,在线工具却可行
我在.NET MAUI中调用WebService,使用Flurl的代码如下:
internal static bool GetTypeConfigurations(string smartRequestUrl, string serviceToken, out DataTable? dt) { bool okay = true; dt = null; try { string? response = smartRequestUrl .AppendPathSegment("MyRequest") .AppendPathSegment("GetTypeConfigurations") .WithTimeout(TimeSpan.FromSeconds(15)) .WithOAuthBearerToken(serviceToken) .GetStringAsync() .Result.Trim(); dt = Functions.ConvertFromBase64String<DataTable>(response); okay = (dt != null); } catch (Exception ex) { okay = false; ErrorHandling.HandleError(ex); } return okay; }
配套的转换函数代码:
internal static T? ConvertFromBase64String<T>(string content) where T : class { byte[]? bytes = null; try { if (content == null) return null; bytes = Convert.FromBase64String(content); } catch (Exception ex) { ErrorHandling.HandleError(ex); } return (T)DecompressNone(bytes); } private static byte[]? CompressNone(object obj) { byte[]? serializedObj = null; try { using MemoryStream ms = new MemoryStream(); BinaryFormatter binaryFormatter = new BinaryFormatter(); binaryFormatter.Serialize(ms, obj); WSEBugWorkAroundSerialization(ms); serializedObj = ms.ToArray(); } catch (Exception ex) { ErrorHandling.HandleError(ex); } return serializedObj; }
从接口获取的响应示例:
AAEAAAD/////AQAAAAAAAAAMAgAAAE5TeXN0ZW0uRGF0YSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MT............
调用ConvertFromBase64String时,在bytes = Convert.FromBase64String(content);行抛出错误:
The input is not a valid Base-64 string as it contains a non-base 64 character, more than two padding characters, or an illegal character among the padding characters.
即使在dt = Functions.ConvertFromBase64String<DataTable>(response);行打了断点,在Visual Studio中查看response值时也会弹出相同错误,但在线Base64解码工具却能正常解码该响应。
请问为何Visual Studio中无法解码该响应,而在线工具可以?我的response变量存在什么问题?
1. 响应中存在非Base64合法字符
你只调用了Trim()去除首尾空白,但响应中间可能藏着换行、制表符或者其他不可见的无效字符。在线解码工具通常会自动过滤这些杂项,而.NET的Convert.FromBase64String对输入校验非常严格,只允许A-Z、a-z、0-9、+、/、=这些字符,任何其他字符都会触发错误。
解决办法:先清理response中的所有非合法字符,再解码:
// 只保留Base64允许的字符 var cleanedResponse = new string(response.Where(c => (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || c == '+' || c == '/' || c == '=').ToArray()); dt = Functions.ConvertFromBase64String<DataTable>(cleanedResponse);
2. Base64填充字符缺失
有些WebService返回的Base64会省略末尾的填充字符=,在线工具会自动补全,但.NET的解码函数要求字符串长度必须是4的倍数,不足时必须用=补全。
解决办法:清理后检查并补全填充字符:
int padding = cleanedResponse.Length % 4; if (padding > 0) { cleanedResponse += new string('=', 4 - padding); }
3. 调试器的显示逻辑
调试器查看response时弹出错误,是因为它尝试自动解码展示内容,内部逻辑和你代码里的Convert.FromBase64String一致,所以同样触发错误。这说明response确实不符合标准Base64格式,不是调试器的问题。
额外提醒
你的代码中使用的BinaryFormatter已被.NET Core/.NET 5+标记为不安全,存在反序列化漏洞风险,建议替换成System.Text.Json或Protobuf这类更安全的序列化方案。
内容的提问来源于stack exchange,提问作者Alex

