NewRockClient.cs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. using System.Security.Authentication;
  2. using System.Text;
  3. using System.Xml.Serialization;
  4. using Microsoft.Extensions.Logging;
  5. using NewRock.Sdk.Extensions;
  6. using NewRock.Sdk.Security;
  7. namespace NewRock.Sdk
  8. {
  9. public class NewRockClient : INewRockClient
  10. {
  11. private readonly IHttpClientFactory _httpClientFactory;
  12. private readonly IAuthorizeGenerator _authorizeGenerator;
  13. private readonly ILogger<NewRockClient> _logger;
  14. public NewRockClient(
  15. IHttpClientFactory httpClientFactory,
  16. IAuthorizeGenerator authorizeGenerator,
  17. ILogger<NewRockClient> logger)
  18. {
  19. _httpClientFactory = httpClientFactory;
  20. _authorizeGenerator = authorizeGenerator;
  21. _logger = logger;
  22. }
  23. public async Task<TResponse?> ExecuteAsync<TRequest, TResponse>(TRequest request, string key, int expired, CancellationToken cancellationToken)
  24. where TRequest : INewRockRequest
  25. where TResponse : NewRockResponse
  26. {
  27. var client = _httpClientFactory.CreateClient(Defaults.DeviceName);
  28. client.DefaultRequestHeaders.ConnectionClose = true;
  29. var authorize = _authorizeGenerator.GetAuthorize(key, expired);
  30. var requestContent = request.Serialize(authorize);
  31. _logger.LogInformation($"request: {requestContent}");
  32. var content = new StringContent(requestContent, Encoding.UTF8, "application/xml");
  33. //try...catch为了解决OM设备方主动断开TCP连接
  34. try
  35. {
  36. using var responseMessage = await client.PostAsync(string.Empty, content, cancellationToken);
  37. using var respContent = responseMessage.Content;
  38. var respContentString = await respContent.ReadAsStringAsync(cancellationToken);
  39. _logger.LogInformation($"response: {respContentString}");
  40. if (respContentString.Contains("<Event"))
  41. return default;
  42. var authResult = respContentString.Authentication();
  43. if (authResult != null)
  44. {
  45. throw new AuthenticationException(
  46. string.Format("请求认证失败, code: {code}, err: {err}", authResult.Code, authResult.Reason));
  47. }
  48. return respContentString.DeserializeWithErrorMsg<TResponse>();
  49. //var respContentStream = await respContent.ReadAsStreamAsync(cancellationToken);
  50. //return respContentStream.Deserialize<TResponse>();
  51. }
  52. catch (Exception e)
  53. {
  54. if (!string.IsNullOrEmpty(e.Message))
  55. _logger.LogError(e.Message);
  56. return null;
  57. }
  58. }
  59. }
  60. public class NewRockResponse
  61. {
  62. public bool Success => Error is null;
  63. [XmlIgnore]
  64. public NewRockErrorResponse? Error { get; set; }
  65. }
  66. [XmlRoot("Event")]
  67. public class NewRockErrorResponse
  68. {
  69. [XmlAttribute("attribute")]
  70. public string Attribute { get; set; }
  71. [XmlElement("err")]
  72. public NewRockError Error { get; set; }
  73. }
  74. public class NewRockError
  75. {
  76. [XmlAttribute("code")]
  77. public string Code { get; set; }
  78. [XmlAttribute("reason")]
  79. public string Reason { get; set; }
  80. }
  81. [XmlRoot("err")]
  82. public class UnauthorizedResponse : NewRockResponse
  83. {
  84. [XmlAttribute("code")]
  85. public string Code { get; set; }
  86. [XmlAttribute("reason")]
  87. public string Reason { get; set; }
  88. }
  89. }