如何将HttpWebRequest代码迁移为HttpClient?时间戳计算报错求助
用HttpClient改写时间戳请求代码
下面是基于原逻辑,用HttpClient实现的完整代码:
public async Task<byte[]> GetTimeStampAsync(TimeStampModel model) { // 生成时间戳请求(核心逻辑完全保留,避免计算偏差) var tsrq = new TimeStampRequestGenerator(); tsrq.SetCertReq(model.certReq); var nonce = BigInteger.ValueOf(DateTime.Now.Ticks); var tsr = tsrq.Generate(model.digestMethod.Oid, model.hash, nonce); var requestData = tsr.GetEncoded(); // 初始化HttpClient(建议在应用全局复用单例实例,此处为示例直接创建) using var httpClient = new HttpClient(); // 添加Basic认证头(保持原编码逻辑) if (!string.IsNullOrEmpty(_user) && !string.IsNullOrEmpty(_password)) { var authBytes = Encoding.Default.GetBytes($"{_user}:{_password}"); httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(authBytes, Base64FormattingOptions.None)); } // 构造请求内容 using var content = new ByteArrayContent(requestData); content.Headers.ContentType = new MediaTypeHeaderValue("application/timestamp-query"); // 发送POST请求 using var response = await httpClient.PostAsync(_url, content); // 校验响应状态 response.EnsureSuccessStatusCode(); // 读取并解析响应流 using var responseStream = await response.Content.ReadAsStreamAsync(); using var bufferedStream = new BufferedStream(responseStream); var tsRes = new TimeStampResponse(bufferedStream); // 验证响应有效性 tsRes.Validate(tsr); if (tsRes.TimeStampToken == null) { throw new Exception("服务器未返回任何时间戳"); } return tsRes.TimeStampToken.GetEncoded(); }
针对时间戳计算错误的排查要点
- 核心逻辑严格对齐:原代码中
TimeStampRequestGenerator的调用、nonce生成(DateTime.Now.Ticks)、请求编码这部分是时间戳计算的核心,迁移时不要做任何修改,确保和原逻辑完全一致。 - 配置信息一致:确认
_url、_user、_password等参数和原代码完全相同,避免因请求目标或认证错误导致服务端返回异常响应,被误判为计算错误。 - 对比请求数据:可以将原代码和新代码生成的
requestData转为Base64字符串对比,确认请求体完全一致。 - 流处理保持一致:保留原代码的
BufferedStream处理逻辑,确保TimeStampResponse能正确读取响应流数据。
内容的提问来源于stack exchange,提问作者ebubekirergun
相关产品推荐
相关产品推荐

