在项目开发中,前后端分离已然成为目前的趋势。在后端开发中,netCore 中可以使用Swagger 来方便管理我们的Api 接口。但是生产环境中,我们不想对外暴露api 接口,毕竟这样很不安全,我们会怎么做?
最简单的一种方式就是在Controller 或者Action 上添加【ApiExplorerSettings】属性,并且设置 IgnoreApi=true 如下图所示,这样就会对外隐藏该接口。
但是这样的话,比较麻烦,我们需要一个一个给需要隐藏的Controller 或者Action 增加该属性,而且我们仅仅是在生产环境中隐藏api 接口,测试环境下我们还是希望看到所有的接口,怎么处理呢?
我想到了一个方法,先定义一个过滤器,然后在过滤器上添加【ApiExplorerSettings】属性,在Startup.cs中判断系统运行环境,生产环境下添加该过滤器。但是经过测试发现,该方法不起作用,达不到我们想要的效果。那就没有办法了么,答案是有的,进入本文的正题,我们使用IApplicationModelConvention 就可以实现。
简单一点说,ApplicationModel描述了MVC应用中的各种对象和行为,这些内容包含Application、Controller、Action、Parameter、Router、Page、Property、Filter等等,而Asp.Net Core框架本身内置一套规则(Convention)用来处理这些模型,同时也提供了接口给我们自定义约定来扩展模型以实现更符合需要的应用。如下图所示,
详情可以参考以下网址:
ModelConvention定义了操作模型的入口,又或者说是一种契约,通过它我们可以对模型进行修改,常用的Convention包括:
IApplicationModelConvention
IControllerModelConvention
IActionModelConvention
IParameterModelConvention
IPageRouteModelConvention
这些接口提供了一个共同的方法Apply,方法参数是各自的应用程序模型。有了这些我们可以做很多操作,而且它只会在程序启动时执行一次,可以完美解决上面我们所说的情况。具体代码如下
1.定义一个自己的ModelConvention
2.在startup.cs 中,通过判断程序运行环境,将该约定注入进去
这样,我们就可以在生产环境中对外隐藏Api接口,并且测试环境中不需要改动代码也可以看到所有的Api接口。此处我们只是简单定义了ModelConvention 的Apply中的代码,可以通过Apply中的参数编写更复杂的自定义逻辑,有兴趣的朋友,可以自行研究下。以上内容,如有不妥,欢迎大家指正。