【问题标题】:ASP.NET Core read config IOptions controller not triggeringASP.NET Core 读取配置 IOptions 控制器未触发
【发布时间】: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,感谢您的回复。在构建和运行时我没有发现任何错误。你能帮我如何找到错误,调试步骤吗?

标签: c# asp.net-core


【解决方案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;
}

【讨论】:

    猜你喜欢
    • 2019-04-15
    • 2021-02-23
    • 2017-03-15
    • 1970-01-01
    • 2021-09-30
    • 1970-01-01
    • 1970-01-01
    • 2021-02-09
    • 1970-01-01
    相关资源
    最近更新 更多