同一解决方案中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
相关产品推荐
相关产品推荐

