Add new Hcs.Broker to communicate with ГИС ЖКХ via CryptoPro LibCore
This commit is contained in:
43
Hcs.Broker/MessageCapturer/FileMessageCapturer.cs
Normal file
43
Hcs.Broker/MessageCapturer/FileMessageCapturer.cs
Normal file
@ -0,0 +1,43 @@
|
||||
using Hcs.Broker.Logger;
|
||||
using System.Text;
|
||||
|
||||
namespace Hcs.Broker.MessageCapturer
|
||||
{
|
||||
/// <summary>
|
||||
/// Реализация механизма захвата содержимого сообщений SOAP, записывающая
|
||||
/// каждое сообщение в отдельный файл на диске
|
||||
/// </summary>
|
||||
public class FileMessageCapturer(string directory, ILogger logger) : IMessageCapturer
|
||||
{
|
||||
private readonly string directory = directory;
|
||||
private readonly ILogger logger = logger;
|
||||
|
||||
public void CaptureMessage(bool sent, string messageBody)
|
||||
{
|
||||
var index = 0;
|
||||
var maxIndex = 1000000;
|
||||
string fileName;
|
||||
do
|
||||
{
|
||||
index += 1;
|
||||
|
||||
if (index > maxIndex)
|
||||
{
|
||||
throw new Exception("index value exceeds maxIndex value");
|
||||
}
|
||||
|
||||
fileName = index.ToString("D3") + "_" + (sent ? "message" : "response") + ".xml";
|
||||
|
||||
if (!string.IsNullOrEmpty(directory))
|
||||
{
|
||||
fileName = Path.Combine(directory, fileName);
|
||||
}
|
||||
}
|
||||
while (File.Exists(fileName));
|
||||
|
||||
logger?.WriteLine($"Capturing message to file {fileName}...");
|
||||
|
||||
File.WriteAllText(fileName, messageBody, Encoding.UTF8);
|
||||
}
|
||||
}
|
||||
}
|
||||
11
Hcs.Broker/MessageCapturer/IMessageCapturer.cs
Normal file
11
Hcs.Broker/MessageCapturer/IMessageCapturer.cs
Normal file
@ -0,0 +1,11 @@
|
||||
namespace Hcs.Broker.MessageCapturer
|
||||
{
|
||||
/// <summary>
|
||||
/// Интерфейс для механизма захвата отправляемых и принимаемых
|
||||
/// SOAP сообщений в ходе коммуникации с ГИС ЖКХ
|
||||
/// </summary>
|
||||
public interface IMessageCapturer
|
||||
{
|
||||
internal void CaptureMessage(bool sent, string messageBody);
|
||||
}
|
||||
}
|
||||
49
Hcs.Broker/MessageCapturer/MemoryMessageCapturer.cs
Normal file
49
Hcs.Broker/MessageCapturer/MemoryMessageCapturer.cs
Normal file
@ -0,0 +1,49 @@
|
||||
using System.Text;
|
||||
|
||||
namespace Hcs.Broker.MessageCapturer
|
||||
{
|
||||
/// <summary>
|
||||
/// Реализация захвата содержимого отправляемых и принимаемых SOAP сообщений,
|
||||
/// которая хранит данные в памяти
|
||||
/// </summary>
|
||||
public class MemoryMessageCapturer : IMessageCapturer
|
||||
{
|
||||
private readonly MemoryStream messageCaptureStream;
|
||||
private readonly StreamWriter messageCaptureWriter;
|
||||
|
||||
public MemoryMessageCapturer()
|
||||
{
|
||||
messageCaptureStream = new MemoryStream();
|
||||
messageCaptureWriter = new StreamWriter(messageCaptureStream, Encoding.UTF8);
|
||||
}
|
||||
|
||||
public void CaptureMessage(bool sent, string messageBody)
|
||||
{
|
||||
if (messageCaptureStream.Position > 0)
|
||||
{
|
||||
messageCaptureWriter.WriteLine("");
|
||||
}
|
||||
|
||||
messageCaptureWriter.Write("<!--");
|
||||
messageCaptureWriter.Write(sent ? "SENT " : "RECEIVED ");
|
||||
messageCaptureWriter.Write(DateTime.Now.ToString());
|
||||
messageCaptureWriter.WriteLine("-->");
|
||||
messageCaptureWriter.Write(messageBody);
|
||||
messageCaptureWriter.Flush();
|
||||
}
|
||||
|
||||
public byte[] GetData()
|
||||
{
|
||||
var buf = messageCaptureStream.GetBuffer();
|
||||
var size = (int)messageCaptureStream.Length;
|
||||
var data = new byte[size];
|
||||
Buffer.BlockCopy(buf, 0, data, 0, size);
|
||||
return data;
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return Encoding.UTF8.GetString(GetData());
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user