因此,我将MySql.Data包用于我的.NET核心项目,并将密码散列和盐类(类型为byte[])作为varbinary()存储到数据库中。当从用户中选择密码哈希和salt时,我需要一种将结果转换回字节数组的方法。给定此示例代码
Stream passwordHashStream = dbDataReader.GetStream(0);
byte[] passwordHash;
using (MemoryStream memoryStream = new MemoryStream())
{
await passwordHashStream.CopyToAsync(memoryStream);
passwordHash = memoryStream.ToArray();
}第一行将引发此异常。
MySql.Data.MySqlClient.Interceptors.ExceptionInterceptor.Throw(Exception :数据索引必须是字段中的有效索引,如MySql.Data.MySqlClient.MySqlConnection.Throw(Exception异常)、MySql.Data.MySqlClient.MySqlDataReader.Throw(Exception ex)、MySql.Data.MySqlClient.MySqlDataReader.GetBytes(Int32 i、Int64 fieldOffset、Byte[]缓冲区、Int32缓冲器,( System.Data.Common.DbDataReader.GetStream(Int32序数处的Int32长度)在/.../Infrastructure/Persistence/Repositories/UsersRepository.cs:line 60中的Infrastructure.Persistence.Repositories.UsersRepository.<>c.d.MoveNext()处
尽管读取器包含正确的数据库结果,如下所示(密码为32字节,散列为16字节)

2018年报告了这一错误。
https://bugs.mysql.com/bug.php?id=93374
并且已经确认了身份。关于如何解决这个问题,有什么好的解决办法/解决办法吗?我不想使用GetBytes方法,因为它要求我传递字节数组的长度,并且我希望与它保持独立。
发布于 2020-07-11 17:24:58
卸载MySql.Data并用MySqlConnector替换它。
(披露:我是你发现的MySql窃听器的记者,也是MySqlConnector的主要撰稿人。)
除了修复这个问题还有很多其他的虫子之外,MySqlConnector还增加了真正的异步I/O支持和性能改进。
我不想使用
GetBytes方法,因为它要求我传递字节数组的长度,并且我希望与它保持独立。
如果您不想切换库,GetBytes的一个鲜为人知的特性(由MySql.Data和MySqlConnector支持)是,传入null缓冲区返回所需的长度,因此不需要对其进行硬编码:
// get the length of the column and allocate a buffer
var length = dbDataReader.GetBytes(0, 0, null, 0, 0);
var passwordHash = new byte[length];
// fill the buffer from the column
dbDataReader.GetBytes(0, 0, passwordHash, 0, passwordHash.Length);发布于 2020-07-11 12:33:07
public static async Task<MemoryStream> ToMemoryStream(this Stream stream)
{
var memStream = stream as MemoryStream;
if (memStream == null)
{
memStream = new MemoryStream();
await stream.CopyToAsync(memStream);
}
return memStream;
}
https://stackoverflow.com/questions/62848963
复制相似问题