C# 如何使用HttpClient模拟请求
创始人
2024-11-17 04:42:40
0次

接口定义

/// 
/// 获取时间戳(毫秒).
/// 
/// 
/// 
[HttpPost]
[AllowAnonymous]
[Route("DateTime/GetTimeStamp")]
public string GetTimeStamp([Required] MyDateTime dateTime)
{
  // 没有签名或者签名不匹配返回null.
  if (!Request.Headers.TryGetValue("X-Sign", out var xSign) || GenerateSign(dateTime) != xSign)
  {
    return $"签名{xSign}验证失败";
  }

  // 返回时间戳
  var time = new DateTime(dateTime.Year, dateTime.Month, dateTime.Day, dateTime.Hour, dateTime.Minute, dateTime.Second);
  return ((time.ToUniversalTime().Ticks - 621355968000000000) / 1000).ToString();
}

其中入参定义

/// 
/// 自定义时间类.
/// 
public class MyDateTime
{
  /// 
  /// 年.
  /// 
  public int Year { get; set; }

  /// 
  /// 月.
  /// 
  public int Month { get; set; }

  /// 
  /// 日.
  /// 
  public int Day { get; set; }

  /// 
  /// 时.
  /// 
  public int Hour { get; set; }

  /// 
  /// 分.
  /// 
  public int Minute { get; set; }

  /// 
  /// 秒.
  /// 
  public int Second { get; set; }
}

签名方法

签名的话,我们简单的把入参做keyValue处理,这里对key进行排序,然后返回MD5加密后的结果就行了

/// 
/// 生成签名.
/// 
/// 
/// 
private async Task GenerateSign(MyDateTime dateTime)
{
  // 利用反射获取属性及对应的值,根据key的Name排序
  var properties = dateTime.GetType().GetProperties().OrderBy(e => e.Name);

  // 使用一个字典来存放
  var signDic = new Dictionary();
  foreach (var property in properties)
  {
    var key = property.Name;
    var value = property.GetValue(dateTime)?.ToString();

    signDic.Add(key, value);
  }

  // 用UrlEncoded处理
  var sign = await new FormUrlEncodedContent(signDic).ReadAsStringAsync().ConfigureAwait(false);

  // 返回MD5加密后的结果
  return Convert.ToBase64String(new MD5CryptoServiceProvider().ComputeHash(Encoding.UTF8.GetBytes(sign)));
}

使用HttpClient模拟请求

// 创建HttpClient实例
var httpClient = new HttpClient();

// 请求的时间,2020-10-01 08:10:30
var requestTime = new MyDateTime
{
  Year = 2020,
  Month = 10,
  Day = 1,
  Hour = 8,
  Minute = 10,
  Second = 30,
};

// 设置HttpRequestMessage中的Content。
// 请求入参,我们接口定义的入参是dateTime,所以这里的Key也是dateTime
var requestDic = new Dictionary();
requestDic.Add("dateTime", JsonConvert.SerializeObject(requestTime));
var encodedContent = await new FormUrlEncodedContent(requestDic).ReadAsStringAsync().ConfigureAwait(false);
var httpContent = new StringContent(encodedContent, Encoding.UTF8, "application/x-www-form-urlencoded");

// 添加签名头
var sign = await GenerateSign(requestTime);
httpContent.Headers.Add("X-Sign", sign);

// 生成Request的Message
var httpRequestMessage = new HttpRequestMessage
{
  Method = HttpMethod.Post, // 请求方式
  RequestUri = new Uri("http://localhost:5000/DateTime/GetTimeStamp"), // 请求地址
  Content = httpContent, // 请求内容
};

// 在HttpRequestMessage中可以任意的添加请求头
httpRequestMessage.Headers.Add("GitHub", "XgHao");

// 发送请求
var response = await httpClient.SendAsync(httpRequestMessage).ConfigureAwait(false);
var timeStamp = await response.Content.ReadAsStringAsync().ConfigureAwait(false);

捕获请求

这里我们使用Fiddler来捕获请求

可以看到,我们的签名及我们自己加的其他Header,还有计算返回的时间戳。

C# 如何使用HttpClient模拟请求

切换到WebForms可以看到请求的参数

C# 如何使用HttpClient模拟请求

说明使用HttpClient发送请求成功了。

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...