| | |
| | | /// <summary> |
| | | /// 获取所有实例列表 |
| | | /// </summary> |
| | | [HttpGet] |
| | | [ProducesResponseType(typeof(IEnumerable<InstanceState>), StatusCodes.Status200OK)] |
| | | public ActionResult<IEnumerable<InstanceState>> GetAllInstances() |
| | | [HttpGet("GetAll")] |
| | | [ProducesResponseType(typeof(IEnumerable<object>), StatusCodes.Status200OK)] |
| | | public ActionResult GetAllInstances() |
| | | { |
| | | try |
| | | { |
| | | var instances = _instanceManager.GetAllInstances(); |
| | | var states = instances.Select(i => i.GetState()).ToList(); |
| | | return Ok(states); |
| | | var result = instances.Select(i => new |
| | | { |
| | | instanceId = i.Config.Id, |
| | | name = i.Config.Name, |
| | | plcType = i.Config.PLCType.ToString(), |
| | | port = i.Config.Port, |
| | | status = i.GetState().Status.ToString(), |
| | | clientCount = i.GetState().ClientCount, |
| | | totalRequests = i.GetState().TotalRequests, |
| | | startTime = i.GetState().StartTime, |
| | | lastActivityTime = i.GetState().LastActivityTime, |
| | | errorMessage = i.GetState().ErrorMessage |
| | | }).ToList(); |
| | | return Ok(result); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | |
| | | /// <summary> |
| | | /// 创建新实例 |
| | | /// </summary> |
| | | [HttpPost] |
| | | [ProducesResponseType(typeof(InstanceState), StatusCodes.Status201Created)] |
| | | [HttpPost("Create")] |
| | | [ProducesResponseType(typeof(object), StatusCodes.Status201Created)] |
| | | [ProducesResponseType(StatusCodes.Status400BadRequest)] |
| | | public async Task<ActionResult<InstanceState>> CreateInstance([FromBody] InstanceConfig config) |
| | | public async Task<ActionResult> CreateInstance([FromBody] InstanceConfig config) |
| | | { |
| | | try |
| | | { |
| | |
| | | |
| | | var instance = await _instanceManager.CreateInstanceAsync(config); |
| | | var state = instance.GetState(); |
| | | var result = new |
| | | { |
| | | instanceId = instance.Config.Id, |
| | | name = instance.Config.Name, |
| | | plcType = instance.Config.PLCType.ToString(), |
| | | port = instance.Config.Port, |
| | | status = state.Status.ToString(), |
| | | clientCount = state.ClientCount, |
| | | totalRequests = state.TotalRequests, |
| | | startTime = state.StartTime, |
| | | lastActivityTime = state.LastActivityTime, |
| | | errorMessage = state.ErrorMessage |
| | | }; |
| | | |
| | | return CreatedAtAction( |
| | | nameof(GetInstance), |
| | | new { id = config.Id }, |
| | | state); |
| | | result); |
| | | } |
| | | catch (ArgumentException ex) |
| | | { |
| | |
| | | /// <summary> |
| | | /// 获取指定实例详情 |
| | | /// </summary> |
| | | [HttpGet("{id}")] |
| | | [ProducesResponseType(typeof(InstanceState), StatusCodes.Status200OK)] |
| | | [HttpGet("GetInstance")] |
| | | [ProducesResponseType(typeof(object), StatusCodes.Status200OK)] |
| | | [ProducesResponseType(StatusCodes.Status404NotFound)] |
| | | public ActionResult<InstanceState> GetInstance(string id) |
| | | public ActionResult GetInstance(string id) |
| | | { |
| | | try |
| | | { |
| | |
| | | } |
| | | |
| | | var state = instance.GetState(); |
| | | return Ok(state); |
| | | var result = new |
| | | { |
| | | instanceId = instance.Config.Id, |
| | | name = instance.Config.Name, |
| | | plcType = instance.Config.PLCType.ToString(), |
| | | port = instance.Config.Port, |
| | | status = state.Status.ToString(), |
| | | clientCount = state.ClientCount, |
| | | totalRequests = state.TotalRequests, |
| | | startTime = state.StartTime, |
| | | lastActivityTime = state.LastActivityTime, |
| | | errorMessage = state.ErrorMessage |
| | | }; |
| | | return Ok(result); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 获取指定实例的配置 |
| | | /// </summary> |
| | | [HttpGet("GetInstanceConfig")] |
| | | [ProducesResponseType(typeof(InstanceConfig), StatusCodes.Status200OK)] |
| | | [ProducesResponseType(StatusCodes.Status404NotFound)] |
| | | public ActionResult<InstanceConfig> GetInstanceConfig(string id) |
| | | { |
| | | try |
| | | { |
| | | if (string.IsNullOrWhiteSpace(id)) |
| | | { |
| | | return BadRequest(new { error = "Instance ID is required" }); |
| | | } |
| | | |
| | | var instance = _instanceManager.GetInstance(id); |
| | | if (instance == null) |
| | | { |
| | | return NotFound(new { error = $"Instance with ID '{id}' not found" }); |
| | | } |
| | | |
| | | return Ok(instance.Config); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | _logger.LogError(ex, "Failed to get instance config {InstanceId}", id); |
| | | return StatusCode(StatusCodes.Status500InternalServerError, new { error = "Failed to retrieve instance config" }); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 更新实例配置 |
| | | /// </summary> |
| | | [HttpPut("{id}")] |
| | | [ProducesResponseType(typeof(InstanceState), StatusCodes.Status200OK)] |
| | | [HttpPut("Update")] |
| | | [ProducesResponseType(typeof(object), StatusCodes.Status200OK)] |
| | | [ProducesResponseType(StatusCodes.Status400BadRequest)] |
| | | [ProducesResponseType(StatusCodes.Status404NotFound)] |
| | | public async Task<ActionResult<InstanceState>> UpdateInstance(string id, [FromBody] InstanceConfig config) |
| | | public async Task<ActionResult> UpdateInstance([FromQuery] string id, [FromBody] InstanceConfig config) |
| | | { |
| | | try |
| | | { |
| | |
| | | } |
| | | |
| | | var state = newInstance.GetState(); |
| | | return Ok(state); |
| | | var result = new |
| | | { |
| | | instanceId = newInstance.Config.Id, |
| | | name = newInstance.Config.Name, |
| | | plcType = newInstance.Config.PLCType.ToString(), |
| | | port = newInstance.Config.Port, |
| | | status = state.Status.ToString(), |
| | | clientCount = state.ClientCount, |
| | | totalRequests = state.TotalRequests, |
| | | startTime = state.StartTime, |
| | | lastActivityTime = state.LastActivityTime, |
| | | errorMessage = state.ErrorMessage |
| | | }; |
| | | return Ok(result); |
| | | } |
| | | catch (ArgumentException ex) |
| | | { |
| | |
| | | /// <summary> |
| | | /// 删除实例 |
| | | /// </summary> |
| | | [HttpDelete("{id}")] |
| | | [HttpDelete("Delete")] |
| | | [ProducesResponseType(StatusCodes.Status204NoContent)] |
| | | [ProducesResponseType(StatusCodes.Status404NotFound)] |
| | | public async Task<IActionResult> DeleteInstance(string id, [FromQuery] bool deleteConfig = true) |
| | | public async Task<IActionResult> DeleteInstance(string id, bool deleteConfig = true) |
| | | { |
| | | try |
| | | { |
| | |
| | | /// <summary> |
| | | /// 启动实例 |
| | | /// </summary> |
| | | [HttpPost("{id}/start")] |
| | | [HttpPost("start")] |
| | | [ProducesResponseType(StatusCodes.Status200OK)] |
| | | [ProducesResponseType(StatusCodes.Status404NotFound)] |
| | | [ProducesResponseType(StatusCodes.Status400BadRequest)] |
| | | public async Task<ActionResult<InstanceState>> StartInstance(string id) |
| | | public async Task<ActionResult> StartInstance([FromQuery] string id) |
| | | { |
| | | try |
| | | { |
| | |
| | | |
| | | var instance = _instanceManager.GetInstance(id); |
| | | var state = instance?.GetState(); |
| | | return Ok(state); |
| | | var result = new |
| | | { |
| | | instanceId = instance.Config.Id, |
| | | name = instance.Config.Name, |
| | | plcType = instance.Config.PLCType.ToString(), |
| | | port = instance.Config.Port, |
| | | status = state.Status.ToString(), |
| | | clientCount = state.ClientCount, |
| | | totalRequests = state.TotalRequests, |
| | | startTime = state.StartTime, |
| | | lastActivityTime = state.LastActivityTime, |
| | | errorMessage = state.ErrorMessage |
| | | }; |
| | | return Ok(result); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | |
| | | /// <summary> |
| | | /// 停止实例 |
| | | /// </summary> |
| | | [HttpPost("{id}/stop")] |
| | | [HttpPost("stop")] |
| | | [ProducesResponseType(StatusCodes.Status200OK)] |
| | | [ProducesResponseType(StatusCodes.Status404NotFound)] |
| | | public async Task<ActionResult<InstanceState>> StopInstance(string id) |
| | | public async Task<ActionResult> StopInstance([FromQuery] string id) |
| | | { |
| | | try |
| | | { |
| | |
| | | |
| | | var instance = _instanceManager.GetInstance(id); |
| | | var state = instance?.GetState(); |
| | | return Ok(state); |
| | | var result = new |
| | | { |
| | | instanceId = instance.Config.Id, |
| | | name = instance.Config.Name, |
| | | plcType = instance.Config.PLCType.ToString(), |
| | | port = instance.Config.Port, |
| | | status = state.Status.ToString(), |
| | | clientCount = state.ClientCount, |
| | | totalRequests = state.TotalRequests, |
| | | startTime = state.StartTime, |
| | | lastActivityTime = state.LastActivityTime, |
| | | errorMessage = state.ErrorMessage |
| | | }; |
| | | return Ok(result); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | |
| | | /// <summary> |
| | | /// 重启实例 |
| | | /// </summary> |
| | | [HttpPost("{id}/restart")] |
| | | [HttpPost("restart")] |
| | | [ProducesResponseType(StatusCodes.Status200OK)] |
| | | [ProducesResponseType(StatusCodes.Status404NotFound)] |
| | | [ProducesResponseType(StatusCodes.Status400BadRequest)] |
| | | public async Task<ActionResult<InstanceState>> RestartInstance(string id) |
| | | public async Task<ActionResult> RestartInstance([FromQuery] string id) |
| | | { |
| | | try |
| | | { |
| | |
| | | |
| | | var instance = _instanceManager.GetInstance(id); |
| | | var state = instance?.GetState(); |
| | | return Ok(state); |
| | | var result = new |
| | | { |
| | | instanceId = instance.Config.Id, |
| | | name = instance.Config.Name, |
| | | plcType = instance.Config.PLCType.ToString(), |
| | | port = instance.Config.Port, |
| | | status = state.Status.ToString(), |
| | | clientCount = state.ClientCount, |
| | | totalRequests = state.TotalRequests, |
| | | startTime = state.StartTime, |
| | | lastActivityTime = state.LastActivityTime, |
| | | errorMessage = state.ErrorMessage |
| | | }; |
| | | return Ok(result); |
| | | } |
| | | catch (Exception ex) |
| | | { |