ASP.NET Core 读取配置 IOptions 控制器未触发
Posted
技术标签:
【中文标题】ASP.NET Core 读取配置 IOptions 控制器未触发【英文标题】:ASP.NET Core read config IOptions controller not triggering 【发布时间】:2016-02-26 21:12:55 【问题描述】:我正在尝试使用强类型类读取 appsettings.json 文件并将其作为参数传递给控制器。但是它不起作用。这是代码。
appsettings.json 文件:
"AppSettings":
"ApplicationName": "TestApp"
AppSettings 类:
public class AppSettings
public string ApplicationName get; set;
在启动类中注入:
public void ConfigureServices(IServiceCollection services)
// Add framework services.
services.AddApplicationInsightsTelemetry(Configuration);
services.AddMvc();
services.AddOptions();
services.Configure<AppSettings>(Configuration.GetSection("AppSettings"));
控制器:
public class ValuesController : Controller
private readonly IOptions<AppSettings> _appsettings;
public ValuesController(IOptions<AppSettings> appsettings)
_appsettings = appsettings;
[HttpGet]
public string Get()
return _appsettings.Options.ApplicationName;
启动程序已成功执行。但是,不会调用控制器构造函数或默认 get 方法。
如果我从控制器构造函数中删除 (IOptions appsettings),它可以工作。
我的代码有什么问题。
【问题讨论】:
您的控制台是否出现异常或错误?如果它没有调用构造函数,则意味着它无法解析它,因此应该有一些异常并提供更多信息 您好 TSeng,感谢您的回复。在构建和运行时我没有发现任何错误。你能帮我如何找到错误,调试步骤吗? 【参考方案1】:IOptions.Options 在 beta8 中被重命名为 IOptions.Value。见this question。
从以下位置更改您的 Get 操作:
return _appsettings.Options.ApplicationName;
到:
return _appsettings.Value.ApplicationName;
应该解决这个问题。
2016 年 3 月 8 日更新
我在这里看到的另一个问题是,您将 Get
操作称为“默认”操作,但 ASP.Net Core 中的默认路由在控制器上查找 Index
操作。
您可以将Startup.cs
中的路由配置为默认查找Get
操作而不是Index
操作,方法是修改Configure
函数以包含以下内容:
app.UseMvc(routes =>
routes.MapRoute(
name: "default",
template: "controller=Home/action=Get/id?");
);
默认实现使用模板template: "controller=Home/action=Index/id?"
,这就是它寻找Index
动作的原因。
您的其他选择是将您的 Get
函数更改为 Index
函数,在您访问该站点时在 URL 中明确指定 Get
操作(例如 http://localhost/Values/Get),或指定操作名称对于控制器中的 Get
方法,如下所示:
[HttpGet]
[ActionName("Index")]
public string Get()
return _appsettings.Value.ApplicationName;
【讨论】:
以上是关于ASP.NET Core 读取配置 IOptions 控制器未触发的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET Core 读取配置 IOptions 控制器未触发