Phase0_delete_old_gateway

This commit is contained in:
2026-05-16 15:12:43 +08:00
parent fcd1d39641
commit 07dd459705
37 changed files with 0 additions and 699 deletions

View File

@@ -1,54 +0,0 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.0.31903.59
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{827E0CD3-B72D-47B6-A68D-7590B98EB39B}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IntegrationGateway.Host", "src\IntegrationGateway.Host\IntegrationGateway.Host.csproj", "{8F605B6B-5217-4119-A75E-05FFB4E42347}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IntegrationGateway.Core", "src\IntegrationGateway.Core\IntegrationGateway.Core.csproj", "{D1F85A10-E56A-44E8-96B8-7BC3C91E513B}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{8F605B6B-5217-4119-A75E-05FFB4E42347}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8F605B6B-5217-4119-A75E-05FFB4E42347}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8F605B6B-5217-4119-A75E-05FFB4E42347}.Debug|x64.ActiveCfg = Debug|Any CPU
{8F605B6B-5217-4119-A75E-05FFB4E42347}.Debug|x64.Build.0 = Debug|Any CPU
{8F605B6B-5217-4119-A75E-05FFB4E42347}.Debug|x86.ActiveCfg = Debug|Any CPU
{8F605B6B-5217-4119-A75E-05FFB4E42347}.Debug|x86.Build.0 = Debug|Any CPU
{8F605B6B-5217-4119-A75E-05FFB4E42347}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8F605B6B-5217-4119-A75E-05FFB4E42347}.Release|Any CPU.Build.0 = Release|Any CPU
{8F605B6B-5217-4119-A75E-05FFB4E42347}.Release|x64.ActiveCfg = Release|Any CPU
{8F605B6B-5217-4119-A75E-05FFB4E42347}.Release|x64.Build.0 = Release|Any CPU
{8F605B6B-5217-4119-A75E-05FFB4E42347}.Release|x86.ActiveCfg = Release|Any CPU
{8F605B6B-5217-4119-A75E-05FFB4E42347}.Release|x86.Build.0 = Release|Any CPU
{D1F85A10-E56A-44E8-96B8-7BC3C91E513B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D1F85A10-E56A-44E8-96B8-7BC3C91E513B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D1F85A10-E56A-44E8-96B8-7BC3C91E513B}.Debug|x64.ActiveCfg = Debug|Any CPU
{D1F85A10-E56A-44E8-96B8-7BC3C91E513B}.Debug|x64.Build.0 = Debug|Any CPU
{D1F85A10-E56A-44E8-96B8-7BC3C91E513B}.Debug|x86.ActiveCfg = Debug|Any CPU
{D1F85A10-E56A-44E8-96B8-7BC3C91E513B}.Debug|x86.Build.0 = Debug|Any CPU
{D1F85A10-E56A-44E8-96B8-7BC3C91E513B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D1F85A10-E56A-44E8-96B8-7BC3C91E513B}.Release|Any CPU.Build.0 = Release|Any CPU
{D1F85A10-E56A-44E8-96B8-7BC3C91E513B}.Release|x64.ActiveCfg = Release|Any CPU
{D1F85A10-E56A-44E8-96B8-7BC3C91E513B}.Release|x64.Build.0 = Release|Any CPU
{D1F85A10-E56A-44E8-96B8-7BC3C91E513B}.Release|x86.ActiveCfg = Release|Any CPU
{D1F85A10-E56A-44E8-96B8-7BC3C91E513B}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{8F605B6B-5217-4119-A75E-05FFB4E42347} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B}
{D1F85A10-E56A-44E8-96B8-7BC3C91E513B} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B}
EndGlobalSection
EndGlobal

View File

@@ -1,21 +0,0 @@
namespace IntegrationGateway.Core.Abstractions;
public interface IAcceptsMetadataPush : IIntegrationAdapter
{
Task<MetadataPushResult> PushMetadataAsync(string sourceDeviceId, MetadataChangeSet changes);
}
public class MetadataChangeSet
{
public string? Name { get; set; }
public string? IpAddress { get; set; }
public int? Port { get; set; }
public int? StreamMode { get; set; }
}
public class MetadataPushResult
{
public bool Success { get; set; }
public List<string> RejectedFields { get; set; } = new();
public string? Reason { get; set; }
}

View File

@@ -1,12 +0,0 @@
using IntegrationGateway.Core.Models;
namespace IntegrationGateway.Core.Abstractions;
public interface IHasAlarms : IIntegrationAdapter
{
Task<PagedResult<StandardAlarm>> GetAlarmsAsync(int page, int size, DateTime from, DateTime to,
int? confirmState = null, int? endState = null, List<int>? levels = null);
Task ConfirmAlarmAsync(string alarmId);
Task EndAlarmAsync(string alarmId);
Task<int> GetPendingAlarmCountAsync();
}

View File

@@ -1,12 +0,0 @@
using IntegrationGateway.Core.Models;
namespace IntegrationGateway.Core.Abstractions;
public interface IHasFlatDevices : IIntegrationAdapter
{
Task<PagedResult<StandardDevice>> GetDevicesAsync(int page, int size, string? keyword = null);
Task<StandardDevice?> GetDeviceAsync(string sourceDeviceId);
Task<List<StandardDevice>> GetAllDevicesAsync();
Task<PagedResult<StandardDevice>> GetChannelsAsync(int page, int size, string? parentDeviceId = null);
Task<List<StandardDevice>> GetAllChannelsAsync();
}

View File

@@ -1,8 +0,0 @@
using IntegrationGateway.Core.Models;
namespace IntegrationGateway.Core.Abstractions;
public interface IHasOwnDeviceTree : IIntegrationAdapter
{
Task<List<DeviceTreeNode>> GetObjectTreeAsync();
}

View File

@@ -1,10 +0,0 @@
using IntegrationGateway.Core.Models;
namespace IntegrationGateway.Core.Abstractions;
public interface IHasPoints : IIntegrationAdapter
{
Task<List<PointValue>> GetRealtimeValuesAsync(string sourceDeviceId);
Task<List<PointValue>> GetMultiPointValuesAsync(List<(string DeviceId, int PointIndex)> points);
Task SetPointValueAsync(string sourceDeviceId, int pointIndex, double value);
}

View File

@@ -1,14 +0,0 @@
using IntegrationGateway.Core.Models;
namespace IntegrationGateway.Core.Abstractions;
public interface IHasStreams : IIntegrationAdapter
{
Task<StreamUrls> GetLiveUrlAsync(string channelId);
Task<StreamUrls> GetPlaybackUrlAsync(string channelId, DateTime start, DateTime end);
Task StopPlayAsync(string channelId);
Task<StreamUrls> GetSnapshotAsync(string channelId);
Task PtzControlAsync(string channelId, string direction, float speed);
Task PtzStopAsync(string channelId);
Task<PagedResult<StandardRecording>> GetRecordingsAsync(string channelId, DateTime start, DateTime end, int page, int size);
}

View File

@@ -1,12 +0,0 @@
using IntegrationGateway.Core.Models;
namespace IntegrationGateway.Core.Abstractions;
public interface IIntegrationAdapter
{
string AdapterCode { get; }
string DisplayName { get; }
AdapterCapabilities Capabilities { get; }
Task<bool> HealthCheckAsync();
Task InitializeAsync();
}

View File

@@ -1,27 +0,0 @@
using IntegrationGateway.Core.Abstractions;
namespace IntegrationGateway.Core.Infrastructure;
public class AdapterRegistry
{
private readonly Dictionary<string, IIntegrationAdapter> _adapters = new();
public void Register(IIntegrationAdapter adapter)
{
_adapters[adapter.AdapterCode] = adapter;
}
public IIntegrationAdapter? Get(string adapterCode)
{
_adapters.TryGetValue(adapterCode, out var adapter);
return adapter;
}
public IEnumerable<IIntegrationAdapter> GetAll() => _adapters.Values;
public async Task InitializeAllAsync()
{
foreach (var adapter in _adapters.Values)
await adapter.InitializeAsync();
}
}

View File

@@ -1,30 +0,0 @@
namespace IntegrationGateway.Core.Infrastructure;
public class RateLimiter
{
private readonly SemaphoreSlim _semaphore;
private readonly int _minIntervalMs;
private DateTime _lastRequest = DateTime.MinValue;
public RateLimiter(int maxCallsPerSecond)
{
_semaphore = new SemaphoreSlim(maxCallsPerSecond, maxCallsPerSecond);
_minIntervalMs = 1000 / maxCallsPerSecond;
}
public async Task WaitAsync()
{
await _semaphore.WaitAsync();
try
{
var elapsed = (int)(DateTime.UtcNow - _lastRequest).TotalMilliseconds;
if (elapsed < _minIntervalMs)
await Task.Delay(_minIntervalMs - elapsed);
_lastRequest = DateTime.UtcNow;
}
finally
{
_semaphore.Release();
}
}
}

View File

@@ -1,32 +0,0 @@
using Microsoft.Extensions.Caching.Memory;
namespace IntegrationGateway.Core.Infrastructure;
public class TokenManager
{
private readonly IMemoryCache _cache;
private static readonly SemaphoreSlim _semaphore = new(1, 1);
public TokenManager(IMemoryCache cache) => _cache = cache;
public async Task<string?> GetAsync(string key)
{
_cache.TryGetValue($"token_{key}", out string? token);
return token;
}
public async Task SetAsync(string key, string token, TimeSpan expiresIn)
{
await _semaphore.WaitAsync();
try
{
_cache.Set($"token_{key}", token, expiresIn * 0.9);
}
finally
{
_semaphore.Release();
}
}
public void Remove(string key) => _cache.Remove($"token_{key}");
}

View File

@@ -1,13 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="10.0.8" />
</ItemGroup>
</Project>

View File

@@ -1,14 +0,0 @@
namespace IntegrationGateway.Core.Models;
public class AdapterCapabilities
{
public bool HasObjectTree { get; set; }
public bool HasFlatDevices { get; set; }
public bool HasPoints { get; set; }
public bool HasStreams { get; set; }
public bool HasAlarms { get; set; }
public bool HasRecordings { get; set; }
public bool HasPtz { get; set; }
public bool AcceptsControl { get; set; }
public bool AcceptsMetadataPush { get; set; }
}

View File

@@ -1,13 +0,0 @@
namespace IntegrationGateway.Core.Models;
public class DeviceTreeNode
{
public int SourceId { get; set; }
public string Name { get; set; } = "";
public int NodeType { get; set; }
public int ObjectType { get; set; }
public string? Tag { get; set; }
public Dictionary<string, object?> Option { get; set; } = new();
public List<DeviceTreeNode> Children { get; set; } = new();
public string? ParentPath { get; set; }
}

View File

@@ -1,7 +0,0 @@
namespace IntegrationGateway.Core.Models;
public class PagedResult<T>
{
public List<T> Items { get; set; } = new();
public int Total { get; set; }
}

View File

@@ -1,11 +0,0 @@
namespace IntegrationGateway.Core.Models;
public class PointValue
{
public string SourceDeviceId { get; set; } = "";
public int PointIndex { get; set; }
public double Value { get; set; }
public string? UpdateTime { get; set; }
public int Interval { get; set; }
public bool IsValid { get; set; } = true;
}

View File

@@ -1,16 +0,0 @@
namespace IntegrationGateway.Core.Models;
public class StandardAlarm
{
public string AlarmId { get; set; } = "";
public string? DeviceId { get; set; }
public string AdapterCode { get; set; } = "";
public string Level { get; set; } = "";
public string Title { get; set; } = "";
public string? Content { get; set; }
public DateTime OccurTime { get; set; }
public string Status { get; set; } = "Active";
public string? PointCode { get; set; }
public double? ThresholdValue { get; set; }
public double? ActualValue { get; set; }
}

View File

@@ -1,23 +0,0 @@
namespace IntegrationGateway.Core.Models;
public class StandardDevice
{
public string SourceId { get; set; } = "";
public string AdapterCode { get; set; } = "";
public string Name { get; set; } = "";
public string Category { get; set; } = "";
public string? Type { get; set; }
public string? IpAddress { get; set; }
public int? Port { get; set; }
public bool IsOnline { get; set; }
public string? Location { get; set; }
public double? Lat { get; set; }
public double? Lng { get; set; }
public string? MapModelId { get; set; }
public int ChannelCount { get; set; }
public bool IsParent { get; set; }
public string? ParentSourceId { get; set; }
public string? SourcePath { get; set; }
public Dictionary<string, object?> Extra { get; set; } = new();
public DateTime LastSyncTime { get; set; }
}

View File

@@ -1,14 +0,0 @@
namespace IntegrationGateway.Core.Models;
public class StandardPoint
{
public string SourceDeviceId { get; set; } = "";
public int PointIndex { get; set; }
public int PointType { get; set; }
public string? PointTag { get; set; }
public string PointName { get; set; } = "";
public string? PointDesc { get; set; }
public string? Unit { get; set; }
public bool IsControlPoint { get; set; }
public Dictionary<string, object?>? RawOption { get; set; }
}

View File

@@ -1,12 +0,0 @@
namespace IntegrationGateway.Core.Models;
public class StandardRecording
{
public string Id { get; set; } = "";
public string ChannelId { get; set; } = "";
public DateTime StartedAt { get; set; }
public DateTime EndedAt { get; set; }
public double Duration { get; set; }
public string? FilePath { get; set; }
public long Size { get; set; }
}

View File

@@ -1,11 +0,0 @@
namespace IntegrationGateway.Core.Models;
public class StreamUrls
{
public string? WsFlv { get; set; }
public string? HttpFlv { get; set; }
public string? Hls { get; set; }
public string? WebRtc { get; set; }
public string? Rtmp { get; set; }
public string? Rtsp { get; set; }
}

View File

@@ -1,13 +0,0 @@
namespace IntegrationGateway.Core.Models;
public class SyncReport
{
public string AdapterCode { get; set; } = "";
public int Added { get; set; }
public int Updated { get; set; }
public int Skipped { get; set; }
public int Removed { get; set; }
public List<string> Errors { get; set; } = new();
public DateTime StartTime { get; set; }
public DateTime EndTime { get; set; }
}

View File

@@ -1,32 +0,0 @@
using IntegrationGateway.Core.Abstractions;
using IntegrationGateway.Core.Infrastructure;
using Microsoft.AspNetCore.Mvc;
namespace IntegrationGateway.Host.Controllers;
[ApiController]
[Route("api/gateway/alarms")]
public class AlarmsController : ControllerBase
{
private readonly AdapterRegistry _registry;
public AlarmsController(AdapterRegistry registry) => _registry = registry;
[HttpGet("{adapter}")]
public async Task<IActionResult> GetAlarms(string adapter, [FromQuery] DateTime from, [FromQuery] DateTime to,
[FromQuery] int page = 1, [FromQuery] int size = 50)
{
var a = _registry.Get(adapter);
if (a is not IHasAlarms al) return NotFound();
return Ok(await al.GetAlarmsAsync(page, size, from, to));
}
[HttpPost("{adapter}/{alarmId}/confirm")]
public async Task<IActionResult> Confirm(string adapter, string alarmId)
{
var a = _registry.Get(adapter);
if (a is not IHasAlarms al) return NotFound();
await al.ConfirmAlarmAsync(alarmId);
return Ok(new { status = "confirmed" });
}
}

View File

@@ -1,32 +0,0 @@
using IntegrationGateway.Core.Abstractions;
using IntegrationGateway.Core.Infrastructure;
using IntegrationGateway.Core.Models;
using Microsoft.AspNetCore.Mvc;
namespace IntegrationGateway.Host.Controllers;
[ApiController]
[Route("api/gateway/devices")]
public class DevicesController : ControllerBase
{
private readonly AdapterRegistry _registry;
public DevicesController(AdapterRegistry registry) => _registry = registry;
[HttpGet]
public async Task<IActionResult> GetDevices([FromQuery] string adapter, [FromQuery] int page = 1, [FromQuery] int size = 50)
{
var a = _registry.Get(adapter);
if (a is not IHasFlatDevices f) return NotFound("Adapter not found or unsupported");
return Ok(await f.GetDevicesAsync(page, size));
}
[HttpGet("{adapter}/{deviceId}")]
public async Task<IActionResult> GetDevice(string adapter, string deviceId)
{
var a = _registry.Get(adapter);
if (a is not IHasFlatDevices f) return NotFound();
var d = await f.GetDeviceAsync(deviceId);
return d is null ? NotFound() : Ok(d);
}
}

View File

@@ -1,22 +0,0 @@
using IntegrationGateway.Core.Infrastructure;
using Microsoft.AspNetCore.Mvc;
namespace IntegrationGateway.Host.Controllers;
[ApiController]
[Route("api/gateway/health")]
public class HealthController : ControllerBase
{
private readonly AdapterRegistry _registry;
public HealthController(AdapterRegistry registry) => _registry = registry;
[HttpGet]
public async Task<IActionResult> Get()
{
var status = new Dictionary<string, bool>();
foreach (var adapter in _registry.GetAll())
status[adapter.AdapterCode] = await adapter.HealthCheckAsync();
return Ok(status);
}
}

View File

@@ -1,38 +0,0 @@
using IntegrationGateway.Core.Abstractions;
using IntegrationGateway.Core.Infrastructure;
using Microsoft.AspNetCore.Mvc;
namespace IntegrationGateway.Host.Controllers;
[ApiController]
[Route("api/gateway/realtime")]
public class PointsController : ControllerBase
{
private readonly AdapterRegistry _registry;
public PointsController(AdapterRegistry registry) => _registry = registry;
[HttpGet("{adapter}/{deviceId}")]
public async Task<IActionResult> GetRealtime(string adapter, string deviceId)
{
var a = _registry.Get(adapter);
if (a is not IHasPoints p) return NotFound();
return Ok(await p.GetRealtimeValuesAsync(deviceId));
}
[HttpPost("{adapter}/control")]
public async Task<IActionResult> Control(string adapter, [FromBody] ControlRequest req)
{
var a = _registry.Get(adapter);
if (a is not IHasPoints p) return NotFound();
await p.SetPointValueAsync(req.DeviceId, req.PointIndex, req.Value);
return Ok(new { status = "sent" });
}
}
public class ControlRequest
{
public string DeviceId { get; set; } = "";
public int PointIndex { get; set; }
public double Value { get; set; }
}

View File

@@ -1,37 +0,0 @@
using IntegrationGateway.Core.Abstractions;
using IntegrationGateway.Core.Infrastructure;
using Microsoft.AspNetCore.Mvc;
namespace IntegrationGateway.Host.Controllers;
[ApiController]
[Route("api/gateway/streams")]
public class StreamsController : ControllerBase
{
private readonly AdapterRegistry _registry;
public StreamsController(AdapterRegistry registry) => _registry = registry;
[HttpGet("{adapter}/{channelId}/live")]
public async Task<IActionResult> GetLive(string adapter, string channelId)
{
var a = _registry.Get(adapter);
if (a is not IHasStreams s) return NotFound();
return Ok(await s.GetLiveUrlAsync(channelId));
}
[HttpPost("{adapter}/{channelId}/ptz")]
public async Task<IActionResult> Ptz(string adapter, string channelId, [FromBody] PtzRequest req)
{
var a = _registry.Get(adapter);
if (a is not IHasStreams s) return NotFound();
await s.PtzControlAsync(channelId, req.Direction, req.Speed);
return Ok();
}
}
public class PtzRequest
{
public string Direction { get; set; } = "stop";
public float Speed { get; set; } = 0.5f;
}

View File

@@ -1,59 +0,0 @@
using IntegrationGateway.Core.Abstractions;
using IntegrationGateway.Core.Infrastructure;
using IntegrationGateway.Core.Models;
using Microsoft.AspNetCore.Mvc;
namespace IntegrationGateway.Host.Controllers;
[ApiController]
[Route("api/gateway")]
public class SyncController : ControllerBase
{
private readonly AdapterRegistry _registry;
public SyncController(AdapterRegistry registry) => _registry = registry;
[HttpGet("devices/sync")]
public async Task<IActionResult> SyncDevices([FromQuery] string adapter)
{
var a = _registry.Get(adapter) ?? throw new InvalidOperationException($"Adapter '{adapter}' not found");
var report = new SyncReport { AdapterCode = adapter, StartTime = DateTime.UtcNow };
if (a is IHasFlatDevices f)
report = await SyncFlatDevices(f, report);
else if (a is IHasOwnDeviceTree t)
report = await SyncTreeDevices(t, report);
else
return BadRequest("Adapter does not support device sync");
report.EndTime = DateTime.UtcNow;
return Ok(report);
}
private async Task<SyncReport> SyncFlatDevices(IHasFlatDevices adapter, SyncReport report)
{
var devices = await adapter.GetAllDevicesAsync();
report.Added = devices.Count;
return report;
}
private async Task<SyncReport> SyncTreeDevices(IHasOwnDeviceTree adapter, SyncReport report)
{
var tree = await adapter.GetObjectTreeAsync();
int count = CountDeviceNodes(tree);
report.Added = count;
return report;
}
private int CountDeviceNodes(List<DeviceTreeNode> nodes)
{
int count = 0;
foreach (var n in nodes)
{
if (n.NodeType == 2) count++;
count += CountDeviceNodes(n.Children);
}
return count;
}
}

View File

@@ -1,18 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="8.0.27" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.6.2" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\IntegrationGateway.Core\IntegrationGateway.Core.csproj" />
</ItemGroup>
</Project>

View File

@@ -1,6 +0,0 @@
@IntegrationGateway.Host_HostAddress = http://localhost:5294
GET {{IntegrationGateway.Host_HostAddress}}/weatherforecast/
Accept: application/json
###

View File

@@ -1,14 +0,0 @@
using IntegrationGateway.Core.Infrastructure;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
builder.Services.AddMemoryCache();
builder.Services.AddSingleton<AdapterRegistry>();
builder.Services.AddSingleton<TokenManager>();
var app = builder.Build();
app.MapControllers();
app.Run();

View File

@@ -1,31 +0,0 @@
{
"$schema": "http://json.schemastore.org/launchsettings.json",
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:35846",
"sslPort": 0
}
},
"profiles": {
"http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"launchUrl": "swagger",
"applicationUrl": "http://localhost:5294",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"launchUrl": "swagger",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}

View File

@@ -1,8 +0,0 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
}
}

View File

@@ -1,23 +0,0 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"Urls": "http://*:5100",
"Adapters": {
"Owl": {
"BaseUrl": "http://owl_host:80",
"Username": "admin",
"Password": "your_owl_password"
},
"MC4": {
"BaseUrl": "http://mc4_host:3000",
"Username": "admin",
"Password": "your_mc4_password",
"RateLimitPerSecond": 2
}
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 352 KiB

After

Width:  |  Height:  |  Size: 903 KiB