wanshenmean
2026-03-13 a2b55742c64f4b2c9e6bd85ed3733adccdec48de
fix: 修复Web页面HttpClient依赖注入问题

- 在Program.cs中注册HttpClient服务
- 将HttpClient注入改为IHttpClientFactory注入
- 在每个方法中动态创建HttpClient并设置BaseAddress
- 修复Create/Edit/Details页面的依赖注入问题

修复了创建实例页面报错:
InvalidOperationException: Unable to resolve service for type
'System.Net.Http.IHttpClientFactory'

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
已修改4个文件
47 ■■■■■ 文件已修改
Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Web/Pages/Create.cshtml.cs 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Web/Pages/Details.cshtml.cs 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Web/Pages/Edit.cshtml.cs 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Web/Program.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Web/Pages/Create.cshtml.cs
@@ -12,13 +12,12 @@
public class CreateModel : PageModel
{
    private readonly ILogger<CreateModel> _logger;
    private readonly HttpClient _httpClient;
    private readonly IHttpClientFactory _httpClientFactory;
    public CreateModel(ILogger<CreateModel> logger, IHttpClientFactory httpClientFactory)
    {
        _logger = logger;
        _httpClient = httpClientFactory.CreateClient();
        _httpClient.BaseAddress = new Uri($"{Request.Scheme}://{Request.Host}");
        _httpClientFactory = httpClientFactory;
    }
    [BindProperty]
@@ -38,6 +37,10 @@
        try
        {
            // 创建HttpClient并设置BaseAddress
            var httpClient = _httpClientFactory.CreateClient();
            httpClient.BaseAddress = new Uri($"{Request.Scheme}://{Request.Host}");
            var config = new InstanceConfig
            {
                Id = Input.Id,
@@ -58,7 +61,7 @@
                }
            };
            var response = await _httpClient.PostAsJsonAsync("/api/SimulatorInstances", config);
            var response = await httpClient.PostAsJsonAsync("/api/SimulatorInstances", config);
            if (response.IsSuccessStatusCode)
            {
Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Web/Pages/Details.cshtml.cs
@@ -10,13 +10,12 @@
public class DetailsModel : PageModel
{
    private readonly ILogger<DetailsModel> _logger;
    private readonly HttpClient _httpClient;
    private readonly IHttpClientFactory _httpClientFactory;
    public DetailsModel(ILogger<DetailsModel> logger, IHttpClientFactory httpClientFactory)
    {
        _logger = logger;
        _httpClient = httpClientFactory.CreateClient();
        _httpClient.BaseAddress = new Uri($"{Request.Scheme}://{Request.Host}");
        _httpClientFactory = httpClientFactory;
    }
    public InstanceState? Instance { get; private set; }
@@ -32,14 +31,17 @@
        try
        {
            var response = await _httpClient.GetAsync($"/api/SimulatorInstances/{Uri.EscapeDataString(id)}");
            var httpClient = _httpClientFactory.CreateClient();
            httpClient.BaseAddress = new Uri($"{Request.Scheme}://{Request.Host}");
            var response = await httpClient.GetAsync($"/api/SimulatorInstances/{Uri.EscapeDataString(id)}");
            if (response.IsSuccessStatusCode)
            {
                Instance = await response.Content.ReadFromJsonAsync<InstanceState>();
                // Load clients
                var clientsResponse = await _httpClient.GetAsync($"/api/instances/{Uri.EscapeDataString(id)}/Clients");
                var clientsResponse = await httpClient.GetAsync($"/api/instances/{Uri.EscapeDataString(id)}/Clients");
                if (clientsResponse.IsSuccessStatusCode)
                {
                    Clients = await clientsResponse.Content.ReadFromJsonAsync<List<S7ClientConnection>>() ?? new();
Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Web/Pages/Edit.cshtml.cs
@@ -12,13 +12,12 @@
public class EditModel : PageModel
{
    private readonly ILogger<EditModel> _logger;
    private readonly HttpClient _httpClient;
    private readonly IHttpClientFactory _httpClientFactory;
    public EditModel(ILogger<EditModel> logger, IHttpClientFactory httpClientFactory)
    {
        _logger = logger;
        _httpClient = httpClientFactory.CreateClient();
        _httpClient.BaseAddress = new Uri($"{Request.Scheme}://{Request.Host}");
        _httpClientFactory = httpClientFactory;
    }
    [BindProperty]
@@ -37,7 +36,10 @@
        try
        {
            var response = await _httpClient.GetAsync($"/api/SimulatorInstances/{Uri.EscapeDataString(id)}");
            var httpClient = _httpClientFactory.CreateClient();
            httpClient.BaseAddress = new Uri($"{Request.Scheme}://{Request.Host}");
            var response = await httpClient.GetAsync($"/api/SimulatorInstances/{Uri.EscapeDataString(id)}");
            if (response.IsSuccessStatusCode)
            {
@@ -45,7 +47,7 @@
                IsRunning = CurrentInstance?.Status == InstanceStatus.Running;
                // Load existing config
                var configResponse = await _httpClient.GetAsync($"/api/SimulatorInstances");
                var configResponse = await httpClient.GetAsync($"/api/SimulatorInstances");
                if (configResponse.IsSuccessStatusCode)
                {
                    var allInstances = await configResponse.Content.ReadFromJsonAsync<List<InstanceState>>();
@@ -82,6 +84,10 @@
        try
        {
            // 创建HttpClient并设置BaseAddress
            var httpClient = _httpClientFactory.CreateClient();
            httpClient.BaseAddress = new Uri($"{Request.Scheme}://{Request.Host}");
            var config = new InstanceConfig
            {
                Id = Input.Id,
@@ -102,7 +108,7 @@
                }
            };
            var response = await _httpClient.PutAsJsonAsync($"/api/SimulatorInstances/{Uri.EscapeDataString(Input.Id)}", config);
            var response = await httpClient.PutAsJsonAsync($"/api/SimulatorInstances/{Uri.EscapeDataString(Input.Id)}", config);
            if (response.IsSuccessStatusCode)
            {
@@ -134,7 +140,10 @@
    {
        try
        {
            var response = await _httpClient.GetAsync($"/api/SimulatorInstances/{Uri.EscapeDataString(id)}");
            var httpClient = _httpClientFactory.CreateClient();
            httpClient.BaseAddress = new Uri($"{Request.Scheme}://{Request.Host}");
            var response = await httpClient.GetAsync($"/api/SimulatorInstances/{Uri.EscapeDataString(id)}");
            if (response.IsSuccessStatusCode)
            {
                CurrentInstance = await response.Content.ReadFromJsonAsync<InstanceState>();
Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Web/Program.cs
@@ -2,6 +2,7 @@
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddHttpClient(); // 注册HttpClient服务,用于调用API
var app = builder.Build();