using System.Text.Json;
|
using Microsoft.AspNetCore.Http;
|
using WIDESEAWCS_S7Simulator.Core.Entities;
|
|
namespace WIDESEAWCS_S7Simulator.Web.Services
|
{
|
/// <summary>
|
/// API HTTP 客户端辅助类
|
/// </summary>
|
public class ApiHttpClient
|
{
|
private readonly HttpClient _httpClient;
|
private readonly string _apiBaseUrl;
|
|
private readonly JsonSerializerOptions _jsonOptions = new JsonSerializerOptions
|
{
|
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
|
PropertyNameCaseInsensitive = true
|
};
|
|
public ApiHttpClient(string apiBaseUrl, HttpClient httpClient)
|
{
|
_apiBaseUrl = apiBaseUrl.TrimEnd('/');
|
_httpClient = httpClient;
|
_httpClient.BaseAddress = new Uri(_apiBaseUrl);
|
}
|
|
/// <summary>
|
/// 获取所有实例
|
/// </summary>
|
public async Task<List<InstanceListItem>> GetAllInstancesAsync()
|
{
|
var response = await _httpClient.GetAsync($"{_apiBaseUrl}/api/SimulatorInstances");
|
response.EnsureSuccessStatusCode();
|
|
var json = await response.Content.ReadAsStringAsync();
|
return JsonSerializer.Deserialize<List<InstanceListItem>>(json, _jsonOptions) ?? new();
|
}
|
|
/// <summary>
|
/// 获取指定实例状态
|
/// </summary>
|
public async Task<InstanceState?> GetInstanceAsync(string id)
|
{
|
var response = await _httpClient.GetAsync($"{_apiBaseUrl}/api/SimulatorInstances/{Uri.EscapeDataString(id)}");
|
if (response.StatusCode == System.Net.HttpStatusCode.NotFound)
|
return null;
|
|
response.EnsureSuccessStatusCode();
|
|
var json = await response.Content.ReadAsStringAsync();
|
return JsonSerializer.Deserialize<InstanceState>(json, _jsonOptions);
|
}
|
|
/// <summary>
|
/// 获取实例配置
|
/// </summary>
|
public async Task<InstanceConfig?> GetInstanceConfigAsync(string id)
|
{
|
var response = await _httpClient.GetAsync($"{_apiBaseUrl}/api/SimulatorInstances/{Uri.EscapeDataString(id)}/config");
|
if (response.StatusCode == System.Net.HttpStatusCode.NotFound)
|
return null;
|
|
response.EnsureSuccessStatusCode();
|
|
var json = await response.Content.ReadAsStringAsync();
|
return JsonSerializer.Deserialize<InstanceConfig>(json, _jsonOptions);
|
}
|
|
/// <summary>
|
/// 创建实例
|
/// </summary>
|
public async Task<InstanceState?> CreateInstanceAsync(InstanceConfig config)
|
{
|
var json = JsonSerializer.Serialize(config, new JsonSerializerOptions
|
{
|
PropertyNamingPolicy = JsonNamingPolicy.CamelCase
|
});
|
|
var content = new StringContent(json, System.Text.Encoding.UTF8, "application/json");
|
var response = await _httpClient.PostAsync($"{_apiBaseUrl}/api/SimulatorInstances", content);
|
|
if (!response.IsSuccessStatusCode)
|
return null;
|
|
var resultJson = await response.Content.ReadAsStringAsync();
|
return JsonSerializer.Deserialize<InstanceState>(resultJson, _jsonOptions);
|
}
|
|
/// <summary>
|
/// 更新实例
|
/// </summary>
|
public async Task<InstanceState?> UpdateInstanceAsync(string id, InstanceConfig config)
|
{
|
var json = JsonSerializer.Serialize(config, new JsonSerializerOptions
|
{
|
PropertyNamingPolicy = JsonNamingPolicy.CamelCase
|
});
|
|
var content = new StringContent(json, System.Text.Encoding.UTF8, "application/json");
|
var response = await _httpClient.PutAsync($"{_apiBaseUrl}/api/SimulatorInstances/{Uri.EscapeDataString(id)}", content);
|
|
if (!response.IsSuccessStatusCode)
|
return null;
|
|
var resultJson = await response.Content.ReadAsStringAsync();
|
return JsonSerializer.Deserialize<InstanceState>(resultJson, _jsonOptions);
|
}
|
|
/// <summary>
|
/// 删除实例
|
/// </summary>
|
public async Task<bool> DeleteInstanceAsync(string id, bool deleteConfig = true)
|
{
|
var response = await _httpClient.DeleteAsync($"{_apiBaseUrl}/api/SimulatorInstances/{Uri.EscapeDataString(id)}?deleteConfig={deleteConfig}");
|
return response.IsSuccessStatusCode;
|
}
|
|
/// <summary>
|
/// 启动实例
|
/// </summary>
|
public async Task<InstanceState?> StartInstanceAsync(string id)
|
{
|
var response = await _httpClient.PostAsync($"{_apiBaseUrl}/api/SimulatorInstances/{Uri.EscapeDataString(id)}/start", null);
|
if (!response.IsSuccessStatusCode)
|
return null;
|
|
var resultJson = await response.Content.ReadAsStringAsync();
|
return JsonSerializer.Deserialize<InstanceState>(resultJson, _jsonOptions);
|
}
|
|
/// <summary>
|
/// 停止实例
|
/// </summary>
|
public async Task<InstanceState?> StopInstanceAsync(string id)
|
{
|
var response = await _httpClient.PostAsync($"{_apiBaseUrl}/api/SimulatorInstances/{Uri.EscapeDataString(id)}/stop", null);
|
if (!response.IsSuccessStatusCode)
|
return null;
|
|
var resultJson = await response.Content.ReadAsStringAsync();
|
return JsonSerializer.Deserialize<InstanceState>(resultJson, _jsonOptions);
|
}
|
|
/// <summary>
|
/// 重启实例
|
/// </summary>
|
public async Task<InstanceState?> RestartInstanceAsync(string id)
|
{
|
var response = await _httpClient.PostAsync($"{_apiBaseUrl}/api/SimulatorInstances/{Uri.EscapeDataString(id)}/restart", null);
|
if (!response.IsSuccessStatusCode)
|
return null;
|
|
var resultJson = await response.Content.ReadAsStringAsync();
|
return JsonSerializer.Deserialize<InstanceState>(resultJson, _jsonOptions);
|
}
|
}
|
|
/// <summary>
|
/// 实例列表项
|
/// </summary>
|
public class InstanceListItem
|
{
|
public string InstanceId { get; set; } = string.Empty;
|
public string Name { get; set; } = string.Empty;
|
public string PlcType { get; set; } = string.Empty;
|
public int Port { get; set; }
|
public string Status { get; set; } = string.Empty;
|
public int ClientCount { get; set; }
|
public long TotalRequests { get; set; }
|
public DateTime? StartTime { get; set; }
|
public DateTime? LastActivityTime { get; set; }
|
public string? ErrorMessage { get; set; }
|
}
|
}
|