test .
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
using System.Text;
|
using System.Security.Cryptography;
|
||||||
|
using System.Text;
|
||||||
using Dlhis.Basic.Organization.Request;
|
using Dlhis.Basic.Organization.Request;
|
||||||
using Dlhis.Basic.Organization.Response;
|
using Dlhis.Basic.Organization.Response;
|
||||||
using Dlhis.Basic.Organization.Services;
|
using Dlhis.Basic.Organization.Services;
|
||||||
@@ -18,10 +19,12 @@ namespace Dlhis.Basic.Organization.Controllers;
|
|||||||
public class GainfoFacesController : ControllerBase
|
public class GainfoFacesController : ControllerBase
|
||||||
{
|
{
|
||||||
private readonly IGainfoFaceService _gainfoFaceService;
|
private readonly IGainfoFaceService _gainfoFaceService;
|
||||||
|
private readonly IHttpClientFactory _httpClientFactory;
|
||||||
|
|
||||||
public GainfoFacesController(IGainfoFaceService gainfoFaceService)
|
public GainfoFacesController(IGainfoFaceService gainfoFaceService, IHttpClientFactory httpClientFactory)
|
||||||
{
|
{
|
||||||
_gainfoFaceService = gainfoFaceService;
|
_gainfoFaceService = gainfoFaceService;
|
||||||
|
_httpClientFactory = httpClientFactory;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -37,13 +40,167 @@ public class GainfoFacesController : ControllerBase
|
|||||||
|
|
||||||
[AllowAnonymous]
|
[AllowAnonymous]
|
||||||
[HttpPost("test")]
|
[HttpPost("test")]
|
||||||
public string TestAsync(GainfoFaceValidateRequest request)
|
public async Task<string> TestAsync(GainfoFaceValidateRequest request)
|
||||||
{
|
{
|
||||||
HttpUtillib.SetPlatformInfo("27390082", "MLl7Dv7p5Pgc9XYI3r4O", "10.32.0.10", 443, true);
|
var client = _httpClientFactory.CreateClient("hik-openapi");
|
||||||
|
var body = request.ToJson();
|
||||||
|
var url = "/artemis/api/frs/v1/application/oneToOne";
|
||||||
|
var key = "27390082";
|
||||||
|
var secret = "MLl7Dv7p5Pgc9XYI3r4O";
|
||||||
|
|
||||||
var r = HttpUtillib.HttpPost("/artemis/api/frs/v1/application/oneToOne", request.ToJson(), 15);
|
var headers = InitRequest(url, body, key, secret);
|
||||||
var rs = Encoding.UTF8.GetString(r);
|
foreach (var item in headers)
|
||||||
|
{
|
||||||
|
client.DefaultRequestHeaders.Add(item.Key, item.Value);
|
||||||
|
}
|
||||||
|
|
||||||
return rs;
|
var r = await client.PostAsync(url, new StringContent(body));
|
||||||
|
return await r.Content.ReadAsStringAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Dictionary<string, string> InitRequest(string url, string body, string key, string secret)
|
||||||
|
{
|
||||||
|
Dictionary<string, string> header = new Dictionary<string, string>();
|
||||||
|
|
||||||
|
// Accept
|
||||||
|
header.Add("Accept", "application/json");
|
||||||
|
|
||||||
|
// ContentType
|
||||||
|
header.Add("Content-Type", "application/json");
|
||||||
|
|
||||||
|
//if POST content-md5,be careful it must be lower case.
|
||||||
|
string contentMd5 = computeContentMd5(body);
|
||||||
|
header.Add("content-md5", contentMd5);
|
||||||
|
|
||||||
|
// x-ca-timestamp
|
||||||
|
string timestamp = ((DateTime.Now.Ticks - TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1, 0, 0, 0, 0)).Ticks) / 1000).ToString();
|
||||||
|
header.Add("x-ca-timestamp", timestamp);
|
||||||
|
|
||||||
|
// x-ca-nonce
|
||||||
|
string nonce = System.Guid.NewGuid().ToString();
|
||||||
|
header.Add("x-ca-nonce", nonce);
|
||||||
|
|
||||||
|
// x-ca-key
|
||||||
|
header.Add("x-ca-key", key);
|
||||||
|
|
||||||
|
// build string to sign
|
||||||
|
string strToSign = buildSignString("POST", url, header);
|
||||||
|
string signedStr = computeForHMACSHA256(strToSign, secret);
|
||||||
|
|
||||||
|
// x-ca-signature
|
||||||
|
header.Add("x-ca-signature", signedStr);
|
||||||
|
|
||||||
|
return header;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 计算content-md5
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="body"></param>
|
||||||
|
/// <returns>base64后的content-md5</returns>
|
||||||
|
private static string computeContentMd5(string body)
|
||||||
|
{
|
||||||
|
MD5 md5 = new MD5CryptoServiceProvider();
|
||||||
|
byte[] result = md5.ComputeHash(System.Text.Encoding.UTF8.GetBytes(body));
|
||||||
|
return Convert.ToBase64String(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 计算HMACSHA265
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="str">待计算字符串</param>
|
||||||
|
/// <param name="secret">平台APPSecet</param>
|
||||||
|
/// <returns>HMAXH265计算结果字符串</returns>
|
||||||
|
private static string computeForHMACSHA256(string str, string secret)
|
||||||
|
{
|
||||||
|
var encoder = new System.Text.UTF8Encoding();
|
||||||
|
byte[] secretBytes = encoder.GetBytes(secret);
|
||||||
|
byte[] strBytes = encoder.GetBytes(str);
|
||||||
|
var opertor = new HMACSHA256(secretBytes);
|
||||||
|
byte[] hashbytes = opertor.ComputeHash(strBytes);
|
||||||
|
return Convert.ToBase64String(hashbytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 计算签名字符串
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="method">HTTP请求方法,如“POST”</param>
|
||||||
|
/// <param name="url">接口Url,如/artemis/api/resource/v1/org/advance/orgList</param>
|
||||||
|
/// <param name="header">请求头</param>
|
||||||
|
/// <returns>签名字符串</returns>
|
||||||
|
private static string buildSignString(string method, string url, Dictionary<string, string> header)
|
||||||
|
{
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
sb.Append(method.ToUpper()).Append("\n");
|
||||||
|
if (null != header)
|
||||||
|
{
|
||||||
|
if (null != header["Accept"])
|
||||||
|
{
|
||||||
|
sb.Append((string)header["Accept"]);
|
||||||
|
sb.Append("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (header.Keys.Contains("Content-MD5") && null != header["Content-MD5"])
|
||||||
|
{
|
||||||
|
sb.Append((string)header["Content-MD5"]);
|
||||||
|
sb.Append("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (null != header["Content-Type"])
|
||||||
|
{
|
||||||
|
sb.Append((string)header["Content-Type"]);
|
||||||
|
sb.Append("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (header.Keys.Contains("Date") && null != header["Date"])
|
||||||
|
{
|
||||||
|
sb.Append((string)header["Date"]);
|
||||||
|
sb.Append("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// build and add header to sign
|
||||||
|
string signHeader = buildSignHeader(header);
|
||||||
|
sb.Append(signHeader);
|
||||||
|
sb.Append(url);
|
||||||
|
return sb.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 计算签名头
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="header">请求头</param>
|
||||||
|
/// <returns>签名头</returns>
|
||||||
|
private static string buildSignHeader(Dictionary<string, string> header)
|
||||||
|
{
|
||||||
|
Dictionary<string, string> sortedDicHeader = new Dictionary<string, string>();
|
||||||
|
sortedDicHeader = header;
|
||||||
|
var dic = from objDic in sortedDicHeader orderby objDic.Key ascending select objDic;
|
||||||
|
|
||||||
|
StringBuilder sbSignHeader = new StringBuilder();
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
foreach (KeyValuePair<string, string> kvp in dic)
|
||||||
|
{
|
||||||
|
if (kvp.Key.Replace(" ", "").Contains("x-ca-"))
|
||||||
|
{
|
||||||
|
sb.Append(kvp.Key + ":");
|
||||||
|
if (!string.IsNullOrWhiteSpace(kvp.Value))
|
||||||
|
{
|
||||||
|
sb.Append(kvp.Value);
|
||||||
|
}
|
||||||
|
|
||||||
|
sb.Append("\n");
|
||||||
|
if (sbSignHeader.Length > 0)
|
||||||
|
{
|
||||||
|
sbSignHeader.Append(",");
|
||||||
|
}
|
||||||
|
|
||||||
|
sbSignHeader.Append(kvp.Key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
header.Add("x-ca-signature-headers", sbSignHeader.ToString());
|
||||||
|
|
||||||
|
return sb.ToString();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -23,5 +23,18 @@ public class Startup : DefaultStartup
|
|||||||
{
|
{
|
||||||
base.ConfigureServices(services);
|
base.ConfigureServices(services);
|
||||||
services.AddRedis();
|
services.AddRedis();
|
||||||
|
|
||||||
|
services.AddHttpClient("hik-openapi")
|
||||||
|
.ConfigureHttpClient(client => { client.BaseAddress = new Uri("https://10.32.0.10"); })
|
||||||
|
.ConfigurePrimaryHttpMessageHandler(() =>
|
||||||
|
{
|
||||||
|
var handler = new HttpClientHandler
|
||||||
|
{
|
||||||
|
ClientCertificateOptions = ClientCertificateOption.Manual,
|
||||||
|
ServerCertificateCustomValidationCallback = (_, _, _, _) => true
|
||||||
|
};
|
||||||
|
|
||||||
|
return handler;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user