概述:通过模型绑定,控制器操作可直接使用模型类型(作为方法参数传入)而不是 HTTP 请求。 由模型绑定器处理传入的请求数据和应用程序模型之间的映射。开发人员可以通过实现自定义模型绑定器来扩展内置的模型绑定功能(尽管通常不需要编写自己的提供程序)。
一 配置
1.配置的组成部分
- 配置有两个部分,一 一组ReRountes 二 一个GlobalConfiguration。
- GlobalConfiguration 允许覆盖ReRoute的特定配置。
{
"ReRoutes": [],
"GlobalConfiguration": {}
}
- ReRount项的完整设置内容
{
"DownstreamPathTemplate": "/",
"UpstreamPathTemplate": "/",
"UpstreamHttpMethod": [
"Get"
],
"AddHeadersToRequest": {},
"AddClaimsToRequest": {},
"RouteClaimsRequirement": {},
"AddQueriesToRequest": {},
"RequestIdKey": "",
"FileCacheOptions": {
"TtlSeconds": 0,
"Region": ""
},
"ReRouteIsCaseSensitive": false,
"ServiceName": "",
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
{
"Host": "localhost",
"Port": 51876,
}
],
"QoSOptions": {
"ExceptionsAllowedBeforeBreaking": 0,
"DurationOfBreak": 0,
"TimeoutValue": 0
},
"LoadBalancer": "",
"RateLimitOptions": {
"ClientWhitelist": [],
"EnableRateLimiting": false,
"Period": "",
"PeriodTimespan": 0,
"Limit": 0
},
"AuthenticationOptions": {
"AuthenticationProviderKey": "",
"AllowedScopes": []
},
"HttpHandlerOptions": {
"AllowAutoRedirect": true,
"UseCookieContainer": true,
"UseTracing": true
},
"DangerousAcceptAnyServerCertificateValidator": false
}
2.ReRoute
- Ocelot的主要功能是接收传入的http请求,并将请求转发到下游服务;从下游服务获得响应,然后返回。Ocelot目前仅仅是以一个http请求的形式支持。
-
ReRoute描述Ocelot中一个请求路由到弄一个请求。
- ReRoute 实例说明:
{
"DownstreamPathTemplate": "/api/posts/{postId}",
"DownstreamScheme": "https",
"DownstreamHostAndPorts": [
//可以添加多个服务器地址,然后选择负载均衡器
{
"Host": "localhost",
"Port": 80,
}
],
"UpstreamPathTemplate": "/posts/{postId}",
//用于不同的HTTP谓词的请求,路由到不同的下游URL。
"UpstreamHttpMethod": [ "Put", "Delete" ]
}
- 您可以以
{something}
的形式将变量的占位符添加到模板中。占位符变量需要同时存在于DownstreamPathTemplate和UpstreamPathTemplate属性中.
{
"DownstreamPathTemplate": "/api/{everything}",
"DownstreamScheme": "https",
"DownstreamHostAndPorts": [
{
"Host": "localhost",
"Port": 80,
}
],
"UpstreamPathTemplate": "/{everything}",
"UpstreamHttpMethod": [ "Get", "Post" ]
}
-
ReRoute默认是不区分大小写,可以在ReRoute中指定
"ReRouteIsCaseSensitive":true
配置,这样Ocelot将传入的URL与上游模板匹配时将区分大小写。 T[]
: 除了byte[]
类型数组外,绑定将T[]
类型的参数设置为Array.Empty<T>()
。byte[]
类型的数组设置为null
。引用类型
:绑定通过“默认的公共构造函数”创建类的属性而不设置属性。但是,模型绑定将string
参数设置为null
。可null值类型
:设置为null
-
值类型
:设置为default(T)
-
其他特殊类型
IFormFile
、IEnumerable<IFormFile>
:作为http请求的一部分——上传文件(一个或多个)。-
cancelationToken
:用于取消异步控制器中的活动 - 对于绝大多数开发方案,默认模型绑定效果极佳。 它还可以扩展,因此如果你有特殊需求,则可自定义内置行为。
3.通过特性自定义模型绑定行为
-
包含多种特性,可用于将其默认模型绑定行为定向到不同的源。
BindRequired
:如果无法发生绑定,此特性将添加模型状态错误。BindNever
:指示模型绑定器从不绑定到此参数。FromHeader
、FromQuery
、FromRoute
、FromForm
:使用这些特性指定要应用的确切绑定源。FromServices
:此特性使用依赖关系注入绑定服务中的参数。FromBody
:使用配置的格式化程序绑定请求正文中的数据。 基于请求的内容类型,选择格式化程序。ModelBinder
:用于替代默认模型绑定器、绑定源和名称。
4.全局自定义模型绑定和验证
由 ModelMetadata
驱动模型绑定和验证系统的行为,该行为描述:
- 如何绑定模型。
-
如何验证类型及其属性。
- 若要禁用对特定类型的所有模型的模型绑定,在
Startup.ConfigureServices
中添加SuppressChildValidationMetadataProvider
:
//禁用对 System.Version 类型的所有模型的模型绑定
services.AddMvc().AddMvcOptions(options =>
options.ModelMetadataDetailsProviders.Add(
new SuppressChildValidationMetadataProvider(typeof(System.Guid))));
- 要禁用对特定类型的属性的验证,请在
Startup.ConfigureServices
中添加SuppressChildValidationMetadataProvider
。
//禁用对 System.Guid 类型的属性的验证
services.AddMvc().AddMvcOptions(options =>
options.ModelMetadataDetailsProviders.Add(
new SuppressChildValidationMetadataProvider(typeof(System.Guid))));
4.全局自定义模型绑定和验证
请求数据可以有各种格式,包括 JSON、XML 和许多其他格式。 使用 [FromBody]
特性指示要将参数绑定到请求正文中的数据时,MVC 会使用一组已配置的格式化程序基于请求数据的内容类型对请求数据进行处理。 默认情况下,MVC 包括用于处理 JSON 数据的 JsonInputFormatter
类,但你可以添加用于处理 XML 和其他自定义格式的其他格式化程序。
注:对于用 [FromBody]
修饰的每个操作,最多可以有一个参数。 ASP.NET Core MVC 运行时向格式化程序委托读取请求流的责任。 读取参数的请求流后,通常不能为绑定其他 [FromBody]
参数而再次读取请求流。
注:JsonInputFormatter
为默认格式化程序且基于 Json.NET。
- 添加 支持XML请求数据格式
除非有特性应用于 ASP.NET Core,否则它将基于 Content-Type 标头和参数类型来选择输入格式化程序。 如果想要使用 XML 或其他格式,则必须在 Startup.cs
文件中配置该格式,但可能必须先使用 NuGet 获取对 Microsoft.AspNetCore.Mvc.Formatters.Xml
的引用。 启动代码应如下所示:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc()
.AddXmlSerializerFormatters();
}