解读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还支持一个CacheProfileName属性,以便可以读取全局设置的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的属性而存在,具体功能列表如下(就不一一叙述了):
- Filters
- ModelBinders
- ModelValidatorProviders
- ValidationExcludeFilters
- ValueProviderFactories
另外两个:
MaxModelValidationErrors
置模型验证是显示的最大错误数量。
RespectBrowserAcceptHeader
在使用Web API的内容协定功能时,是否遵守Accept Header的定义,默认情况下当media type默认是*/*的时候是忽略Accept header的。如果设置为true,则不忽略。
同步与推荐
本文已同步至目录索引:解读ASP.NET 5 & MVC6系列
解读ASP.NET 5 & MVC6系列(15):MvcOptions配置的更多相关文章
- 解读ASP.NET 5 & MVC6系列
本系列的大部分内容来自于微软源码的阅读和网络,大部分测试代码都是基于VS RC版本进行测试的. 解读ASP.NET 5 & MVC6系列(1):ASP.NET 5简介 解读ASP.NET 5 ...
- 解读ASP.NET 5 & MVC6 ---- 系列文章
本系列的大部分内容来自于微软源码的阅读和网络,大部分测试代码都是基于VS RC版本进行测试的. 解读ASP.NET 5 & MVC6系列(1):ASP.NET 5简介 解读ASP.NET 5 ...
- 解读ASP.NET 5 & MVC6系列(16):自定义View视图文件查找逻辑
之前MVC5和之前的版本中,我们要想对View文件的路径进行控制的话,则必须要对IViewEngine接口的FindPartialView或FindView方法进行重写,所有的视图引擎都继承于该IVi ...
- 解读ASP.NET 5 & MVC6系列(12):基于Lamda表达式的强类型Routing实现
前面的深入理解Routing章节,我们讲到了在MVC中,除了使用默认的ASP.NET 5的路由注册方式,还可以使用基于Attribute的特性(Route和HttpXXX系列方法)来定义.本章,我们将 ...
- 解读ASP.NET 5 & MVC6系列(11):Routing路由
新版Routing功能介绍 在ASP.NET 5和MVC6中,Routing功能被全部重写了,虽然用法有些类似,但和之前的Routing原理完全不太一样了,该Routing框架不仅可以支持MVC和We ...
- [转帖]2016年的文章: 解读ASP.NET 5 & MVC6系列教程(1):ASP.NET 5简介
解读ASP.NET 5 & MVC6系列教程(1):ASP.NET 5简介 更新时间:2016年06月23日 11:38:00 作者:汤姆大叔 我要评论 https://www.jb ...
- 解读ASP.NET 5 & MVC6系列(17):MVC中的其他新特性
(GlobalImport全局导入功能) 默认新建立的MVC程序中,在Views目录下,新增加了一个_GlobalImport.cshtml文件和_ViewStart.cshtml平级,该文件的功能类 ...
- 解读ASP.NET 5 & MVC6系列(14):View Component
在之前的MVC中,我们经常需要类似一种小部件的功能,通常我们都是使用Partial View来实现,因为MVC中没有类似Web Forms中的WebControl的功能.但在MVC6中,这一功能得到了 ...
- 解读ASP.NET 5 & MVC6系列(13):TagHelper
在新版的MVC6中,微软提供了强大的TagHelper功能,以便让我们摆脱如下的臃肿代码: @Html.LabelFor(model => model.FullName) @Html.EditF ...
随机推荐
- 安卓Design之NavigationView的使用
前面讲解了Design包下的TabLayout的使用,下面将带来NavagationView和DrawLayout以及toolbar的联动. 项目已经同步至:https://github.com/na ...
- ENGLISH抠脚童鞋的福利--GitHub汉化插件
今天在某前端群看到一个插件,激动万分啊!我就把插件使用实现的步骤分享一下! 打开chrome浏览器输入地址:chrome://extensions/ : 跳转到其他页面,点击左上角--扩展程序: 将T ...
- 使用代码向一个普通的类注入Spring的实例
转载请在页首注明作者与原文地址 一:应用场景 什么是普通的类,就是没有@Controller,@Service,@Repository,@Component等注解修饰的类,同时xml文件中,也没有相应 ...
- github常见问题【转自百度知道】
1 git config --global user.name "Your Real Name" 2 git config --global user.email you@emai ...
- 微信小程序基础入门
准备 Demo 项目地址 https://github.com/zce/weapp-demo Clone or Download(需准备GIT环境) $ cd path/to/project/root ...
- 移动端API接口优化的术和结果
最近一直在忙工作的事情,所以文章写得有些少. 有3-5篇文章都是写到一半然后被别的事情给打断了,所以,我得找个时间好好补补. 最近一直在关注移动端接口API的可用性问题,在移动时代这个做这个优化能产生 ...
- MySQL存储过程(转)
一.MySQL 创建存储过程 "pr_add" 是个简单的 MySQL 存储过程,这个存储过程有两个 int 类型的输入参数 "a"."b" ...
- Gate Of Babylon bzoj 1272
Gate Of Babylon (1s 128MB) babylon [问题描述] [输入格式] [输出格式] [样例输入] 2 1 10 13 3 [样例输出] 12 [样例说明] [数据范围] 题 ...
- Python subprocess.Popen communicate() 和wait()使用上的区别
之所以会纠结到这个问题上是因为发现在调用Popen的wait方法之后程序一直没有返回.google发现wait是有可能产生死锁的.为了把这个问题彻底弄清楚,搜索一些资料过来看看: 原文链接:http: ...
- Web测试介绍2一 安全测试
安全测试是在IT软件产品的生命周期中,特别是产品开发基本完成到发布阶段,对产品进行检验以验证产品符合安全需求定义和产品质量标准的过程. 主要安全需求包括: (i) 认证 Authent ...