You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同一解决方案中Web API调用Web App静态属性始终返回null

问题原因

核心问题在于两个项目属于独立的应用程序域。静态变量的生命周期和作用范围仅限其所在的应用程序域内:Project1(Web应用)启动时会在自身的应用域中初始化TestClass.TestProp并赋值,但Project2(Web API Core)是完全独立的应用域/进程,它访问的TestClass是本应用域内的全新实例,从未被赋值过,因此返回null。

解决方案

以下是几种可落地的解决办法,按需选择:

1. 共享配置文件

把共用的配置项抽离到独立的共享文件,让两个项目直接读取该文件:

  • 在解决方案根目录创建SharedAppSettings.config:
<?xml version="1.0" encoding="utf-8"?>
<appSettings>
  <add key="somekey" value="你的配置值" />
</appSettings>
  • 在Project1的web.config中引用这个共享文件:
<configuration>
  <appSettings file="..\SharedAppSettings.config">
    <!-- 项目专属配置可写在这里 -->
  </appSettings>
</configuration>
  • 在Project2(Web API Core)的Program.cs中添加配置加载逻辑:
var builder = WebApplication.CreateBuilder(args);

// 加载共享xml配置文件
builder.Configuration.AddXmlFile("..\\SharedAppSettings.config", optional: false, reloadOnChange: true);

// 直接读取配置值
var someKey = builder.Configuration["somekey"];

2. 通过API接口获取配置

在Project1中暴露一个接口返回配置值,Project2通过HTTP请求调用获取:

  • 在Project1中新增控制器:
namespace Project1.Controllers
{
    public class ConfigController : Controller
    {
        public IActionResult GetSomeKey()
        {
            var value = System.Configuration.ConfigurationManager.AppSettings["somekey"];
            return Ok(value);
        }
    }
}
  • 在Project2的控制器中调用该接口:
using System.Net.Http;

namespace Project2.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class TestController : ControllerBase
    {
        private readonly HttpClient _httpClient;

        public TestController(HttpClient httpClient)
        {
            _httpClient = httpClient;
        }

        [HttpGet]
        public async Task<IActionResult> Get()
        {
            // 替换为Project1的实际运行地址
            var configValue = await _httpClient.GetStringAsync("http://localhost:5000/Config/GetSomeKey");
            return Ok(configValue);
        }
    }
}

3. 共享类库+依赖注入

将配置逻辑放到共享类库,通过依赖注入传递配置,彻底避免静态变量跨域问题:

  • 创建类库项目SharedLibrary,添加配置服务类:
namespace SharedLibrary
{
    public class ConfigService
    {
        public string TestProp { get; }

        public ConfigService(string testPropValue)
        {
            TestProp = testPropValue;
        }
    }
}
  • 在Project1中注册服务(以Unity容器为例):
protected void Application_Start(object sender, EventArgs e)
{
    var configValue = System.Configuration.ConfigurationManager.AppSettings["somekey"];
    DependencyResolver.SetResolver(new UnityDependencyResolver(
        new UnityContainer()
            .RegisterInstance<ConfigService>(new ConfigService(configValue))
    ));
}
  • 在Project2中注册并使用服务:
var builder = WebApplication.CreateBuilder(args);
var configValue = builder.Configuration["somekey"]; // 从共享配置文件或自身配置读取
builder.Services.AddSingleton<ConfigService>(new ConfigService(configValue));

// 控制器中注入使用
[ApiController]
[Route("[controller]")]
public class TestController : ControllerBase
{
    private readonly ConfigService _configService;

    public TestController(ConfigService configService)
    {
        _configService = configService;
    }

    [HttpGet]
    public IActionResult Get()
    {
        return Ok(_configService.TestProp);
    }
}

内容的提问来源于stack exchange,提问作者user9671207

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 00:36:06