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

时间:2016-02-26 21:12:56

标签: c# asp.net-core

我正在尝试使用强类型类读取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)。

我的代码有什么问题。

1 个答案:

答案 0 :(得分:1)

IOptions.Options在beta8中重命名为IOptions.Value。请参阅this question

更改您的获取操作:

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?}");
    });

默认的implmentation使用模板template: "{controller=Home}/{action=Index}/{id?}",这就是它寻找Index行为的原因。

您的其他选择是将Get功能更改为Index功能,在您访问网站时明确指定网址中的Get操作(例如http://localhost/Values/Get }),或者在控制器中指定Get方法的操作名称,如下所示:

[HttpGet]
[ActionName("Index")]
public string Get()
{
    return _appsettings.Value.ApplicationName;
}