解读ASP.NET 5 & MVC6系列教程(15):MvcOptions配置
程序模型处理 iapplicationmodelconvention
在mvcoptions
的实例对象上,有一个applicationmodelconventions
属性(类型是:list<iapplicationmodelconvention>
),该属性iapplicationmodelconvention
类型的接口集合,用于处理应用模型applicationmodel
,该集合是在mvc程序启动的时候进行调用,所以在调用之前,我们可以对其进行修改或更新,比如,我们可以针对所有的controller和action在数据库中进行授权定义,在程序启动的时候读取数据授权信息,然后对应用模型applicationmodel
进行处理。 示例如下:
public class permissioncheckapplicationmodelconvention : iapplicationmodelconvention { public void apply(applicationmodel application) { foreach (var controllermodel in application.controllers) { var controllertype = controllermodel.controllertype; var controllername = controllermodel.controllername; controllermodel.actions.tolist().foreach(actionmodel => { var actionname = actionmodel.actionname; var parameters = actionmodel.parameters; // 根据判断条件,操作修改actionmodel }); // 根据判断条件,操作修改controllermodel } } }
视图引擎的管理viewengines
在mvcoptions的实例对象中,有一个viewengines属性用于保存系统的视图引擎集合,以便可以让我们实现自己的自定义视图引擎,比如在《自定义view视图文件查找逻辑》章节中,我们就利用了该特性,来实现了自己的自定义视图引擎,示例如下:
services.addmvc().configure<mvcoptions>(options => { options.viewengines.clear(); options.viewengines.add(typeof(themeviewengine)); });
web api中的输入(inputformater)/输出(outputformater)
输入
web api和目前的mvc的输入参数的处理,目前支持json和xml格式,具体的处理类分别如下:
jsoninputformatter xmldatacontractserializerinputformatter
输出
在web api中,默认的输出格式化器有如下四种:
httpnocontentoutputformatter stringoutputformatter jsonoutputformatter xmldatacontractserializeroutputformatter
上述四种在系统中,是根据不同的情形自动进行判断输出的,具体判断规则如下:
如果是如下类似的action,则使用httpnocontentoutputformatter
返回204,即nocontent。
public task dosomethingasync() { // 返回task } public void dosomething() { // void方法 } public string getstring() { return null; // 返回null } public list<data> getdata() { return null; // 返回null }
如果是如下方法,同样是返回字符串,只有返回类型是string
的action,才使用stringoutputformatter
返回字符串;返回类型是object的action,则使用jsonoutputformatter
返回json类型的字符串数据。
public object getdata() { return"the data"; // 返回json } public string getstring() { return"the data"; // 返回字符串 }
如果上述两种类型的action都不是,则默认使用jsonoutputformatter
返回json数据,如果jsonoutputformatter
格式化器通过如下语句被删除了,那就会使用xmldatacontractserializeroutputformatter
返回xml数据。
services.configure<mvcoptions>(options => options.outputformatters.removeall(formatter => formatter.instance is jsonoutputformatter) );
当然,你也可以使用producesattribute
显示声明使用jsonoutputformatter
格式化器,示例如下。
public class product2controller : controller { [produces("application/json")] //[produces("application/xml")] public product detail(int id) { return new product() { productid = id, productname = "商品名称" }; } }
或者,可以在基类controller上,也可以使用producesattribute
,示例如下:
[produces("application/json")] public class jsoncontroller : controller { } public class homecontroller : jsoncontroller { public list<data> getmedata() { return getdatafromsource(); } }
当然,也可以在全局范围内声明该producesattribute
,示例如下:
services.configure<mvcoptions>(options => options.filters.add(newproducesattribute("application/json")) );
output cache 与 profile
在mvc6中,outputcache的特性由responsecacheattribute
类来支持,示例如下:
[responsecache(duration = 100)] public iactionresult index() { return content(datetime.now.tostring()); }
上述示例表示,将该页面的内容在客户端缓存100秒,换句话说,就是在response响应头header里添加一个cache-control
头,并设置max-age=100
。 该特性支持的属性列表如下:
属性名称 | 描述 |
---|---|
duration | 缓存时间,单位:秒,示例:cache-control:max-age=100
|
nostore | true则设置cache-control:no-store
|
varybyheader | 设置vary header头 |
location | 缓存位置,如将cache-control设置为public, private或no-cache。 |
另外,responsecacheattribute
还支持一个cacheprofilenam
e属性,以便可以读取全局设置的profile信息配置,进行缓存,示例如下:
[responsecache(cacheprofilename = "myprofile")] public iactionresult index() { return content(datetime.now.tostring()); } public void configureservices(iservicecollection services) { services.configure<mvcoptions>(options => { options.cacheprofiles.add("myprofile", new cacheprofile { duration = 100 }); }); }
通过向mvcoptions
的cacheprofiles
属性值添加一个名为myprofile
的个性设置,可以在所有的action上都使用该配置信息。
其它我们已经很熟悉的内容
以下内容我们可能都已经非常熟悉了,因为在之前的mvc版本中都已经使用过了,这些内容均作为mvcoptions的属性而存在,具体功能列表如下(就不一一叙述了):
filtersmodelbindersmodelvalidatorprovidersvalidationexcludefiltersvalueproviderfactories
另外两个:
maxmodelvalidationerrors
置模型验证是显示的最大错误数量。
respectbrowseracceptheader
在使用web api的内容协定功能时,是否遵守accept header的定义,默认情况下当media type默认是*/*
的时候是忽略accept header的。如果设置为true,则不忽略。
推荐阅读
-
解读ASP.NET 5 & MVC6系列教程(2):初识项目
-
解读ASP.NET 5 & MVC6系列教程(4):核心技术与环境配置
-
解读ASP.NET 5 & MVC6系列教程(3):项目发布与部署
-
解读ASP.NET 5 & MVC6系列教程(12):基于Lamda表达式的强类型Routing实现
-
解读ASP.NET 5 & MVC6系列教程(5):Configuration配置信息管理
-
解读ASP.NET 5 & MVC6系列教程(1):ASP.NET 5简介
-
解读ASP.NET 5 & MVC6系列教程(7):依赖注入
-
解读ASP.NET 5 & MVC6系列教程(6):Middleware详解
-
解读ASP.NET 5 & MVC6系列教程(13):TagHelper
-
解读ASP.NET 5 & MVC6系列教程(17):MVC中的其他新特性