Asp.net mvc 使用Microsoft';在api版本之间更改JSON属性的大小写;Web API 2和ODATA的ASP.NET API版本控制?
我将API版本控制引入到现有的API中。现有的JSON使用Pascal大小写作为其属性名,例如“FooBar”:“foo”。对于API的v2,我想使用通用的驼峰式外壳“fooBar”:“foo”。我需要保持v1 Pascal的大小写,这样它就不会影响任何已经在使用该版本API的客户端 我的项目是Asp.net mvc 使用Microsoft';在api版本之间更改JSON属性的大小写;Web API 2和ODATA的ASP.NET API版本控制?,asp.net-mvc,asp.net-web-api2,odata,aspnet-api-versioning,Asp.net Mvc,Asp.net Web Api2,Odata,Aspnet Api Versioning,我将API版本控制引入到现有的API中。现有的JSON使用Pascal大小写作为其属性名,例如“FooBar”:“foo”。对于API的v2,我想使用通用的驼峰式外壳“fooBar”:“foo”。我需要保持v1 Pascal的大小写,这样它就不会影响任何已经在使用该版本API的客户端 我的项目是 ASP.NET MVC 5.2.7 ASP.NET WEB API 5.2.7 ASP.NET ODATA 7.4.0 ASP.NET WEB API版本控制4.0.0 我的配置如下 public
- ASP.NET MVC 5.2.7
- ASP.NET WEB API 5.2.7
- ASP.NET ODATA 7.4.0
- ASP.NET WEB API版本控制4.0.0
public static class WebApiConfig
{
public static void Register(HttpConfiguration configuration)
{
configuration.AddApiVersioning(options => options.ReportApiVersions = true);
var modelBuilder = new VersionedODataModelBuilder(configuration);
AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(x => x.GetTypes())
.Where(x => typeof(IModelConfiguration).IsAssignableFrom(x) && !x.IsInterface && !x.IsAbstract)
.ForEach(t => modelBuilder.ModelConfigurations.Add((IModelConfiguration)Activator.CreateInstance(t)));
var models = modelBuilder.GetEdmModels();
configuration.MapVersionedODataRoutes("odata-bypath", "api/v{apiVersion}", models, builder =>
{
builder.AddService<IODataPathHandler>(Singleton, sp => new DefaultODataPathHandler { UrlKeyDelimiter = Parentheses });
builder.AddService<ODataUriResolver>(Singleton, sp => new UnqualifiedCallAndEnumPrefixFreeResolver { EnableCaseInsensitive = true });
});
configuration.Count().Filter().OrderBy().Expand().Select().MaxTop(null);
configuration.MapHttpAttributeRoutes();
}
}
将使用驼峰式大小写(是的,我知道显式调用是不必要的,因为它是默认的)。然后,我构建了自己的扩展方法ODataConventialModelBuilder().EnablePascalCase()
,该方法模仿EnableLowerCamelCase()
方法来让Pascal套管工作
var modelBuilder = new VersionedODataModelBuilder( configuration )
{
ModelBuilderFactory = () => new ODataConventionModelBuilder().EnablePascalCase()
};
然而,我始终无法找到一种方法来知道我为哪个版本的API构建模型
在某一点上,我认为我使用了OnModelCreating
来添加它
((ODataConventionModelBuilder) builder).OnModelCreating += new PascalCaser().ApplyCase;
每个v1IModelConfiguration
类,但一旦我构建了多个模型,它就不起作用了
有没有办法根据模型的API版本更改JSON属性命名?使用描述的OData模型配置方法 首先将从
IModelConfiguration
派生的类添加到项目中
大概是这样的:
公共类VersionedModelConfiguration:IModelConfiguration
{
专用void配置v1(ODataModelBuilder生成器)
{
建筑商实体集(“产品”);
}
专用void配置v2(ODataModelBuilder生成器)
{
if(builder.GetType().Equals(typeof(ODataConventionModelBuilder)))
{
((ODataConventionModelBuilder)builder).EnableLowerCamelCase();
}
建筑商实体集(“产品”);
}
公共无效应用(ODataModelBuilder builder,ApiVersion)
{
交换机(apiVersion.MajorVersion)
{
案例1:
配置v1(构建器);
打破
案例2:
ConfigureV2(构建器);
打破
违约:
配置v1(构建器);
打破
}
}
}
然后在寄存器中
方法:
/。。。
var modelBuilder=new versionedatamodelbuilder(配置)
{
ModelBuilderFactory=()=>新ODataConventionModelBuilder(),
ModelConfigurations={new VersionedModelConfiguration()}
};
var models=modelBuilder.GetEdmModels();
// ...
不要试图省去这一行ModelBuilderFactory=()=>newodataconventionmodelbuilder()
/api/v1/$metadata
:
/api/v2/$metadata
:
((ODataConventionModelBuilder) builder).OnModelCreating += new PascalCaser().ApplyCase;