Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 使用Microsoft';在api版本之间更改JSON属性的大小写;Web API 2和ODATA的ASP.NET API版本控制?_Asp.net Mvc_Asp.net Web Api2_Odata_Aspnet Api Versioning - Fatal编程技术网

Asp.net mvc 使用Microsoft';在api版本之间更改JSON属性的大小写;Web API 2和ODATA的ASP.NET 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

我将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 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;
每个v1
IModelConfiguration
类,但一旦我构建了多个模型,它就不起作用了


有没有办法根据模型的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;