我们的一个内部/外部服务(B)正在查询字符串中生成带有加密数据的URL;这是为另一个服务(A)生成的。服务B处理此网址的请求。
我发现我无法生成相同的MD5,也不明白为什么。
以下是相关代码及其在整个流程中的位置。
服务A
服务B(链接生成)
服务B(回复链接请求)
MD5代码
生成MD5的代码如下(服务B):
public static string Generate(this MemoryStream stream)
{
if (!stream.CanSeek || !stream.CanRead)
throw new NotSupportedException("Stream must support seek and read to use MD5.Generate()");
using (MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider())
{
stream.Position = 0;
return BitConverter.ToString(md5.ComputeHash(stream)).Replace("-", string.Empty).ToLower();
}
}
代码下载文件并比较MD5
using (HttpClient client = new HttpClient())
{
client.BaseAddress = new Uri(dcBaseUrl);
HttpResponseMessage result = client.GetAsync("USDC/Package/" + request.PackageID).Result;
if (result.StatusCode != HttpStatusCode.OK && result.StatusCode != HttpStatusCode.NotFound)
throw new InvalidOperationException("Distribution Center threw an exception when trying to download package");
downloadResponse.Stream = (MemoryStream)result.Content.ReadAsStreamAsync().Result;
}
string fileMD5 = downloadResponse.Stream.Generate();
// This is ALWAYS false, getting different MD5 and do not know wht
if (!md5.Equals(fileMD5))
throw new InvalidOperationException("md5 mismatch");
我怀疑这是我下载文件的方式,虽然我尝试了很多方法来获取内容,包括:
byte[] package = result.Content.ReadAsByteArrayAsync().Result;
downloadResponse.Stream.Write(package, 0, package.Length);
string fileMD5 = downloadResponse.Stream.Generate();
更新
将文件从两个位置保存到磁盘。文件是一样的: