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 配置文件

关于Asp.net core配置信息读取的源码分析梳理

ASP.NET Core 读取配置 IOptions 控制器未触发

关于Asp.net core配置信息读取的源码分析梳理

ASP.NET CORE读取appsettings.json的配置

ASP.NET Core读取appsettings.json配置文件信息