Asp.net Post IEnumerable(1000条记录)

Asp.net Post IEnumerable(1000条记录),asp.net,rest,asp.net-web-api,odata,ienumerable,Asp.net,Rest,Asp.net Web Api,Odata,Ienumerable,我们正在构建一个简单的批量API来获取和推送大量记录。 对于Get来说,OData似乎是完美的,因为它可以轻松地支持组合查询(而且它几乎是开箱即用的) 然而,我在获得可枚举工作岗位方面面临着严峻的挑战: public class MyObject { public int MyInt {get;set;} } [ODataFormatting, ODataRouting] public class MyObjectController : ApiController {

我们正在构建一个简单的批量API来获取和推送大量记录。 对于Get来说,OData似乎是完美的,因为它可以轻松地支持组合查询(而且它几乎是开箱即用的) 然而,我在获得可枚举工作岗位方面面临着严峻的挑战:

public class MyObject
{
    public int MyInt {get;set;}
}

[ODataFormatting, ODataRouting]
public class MyObjectController 
    : ApiController
{
    [Queryable(PageSize=2)]
    public IQueryable<MyObjecct> Get()
    {
        return Ninject.Get<IMyObjectDb>().MyObjects;
    }

    public HttpResponseMessage Post([FromBody] IList<MyObject> leadList)
    {
        return Request.CreateResponse(HttpStatusCode.Created);
    }
}
如果删除[ODataFormatting,ODataRouting]属性,则上载成功,但我失去了OData查询支持

解决方案(某种) 实际上是[IQueryable]给了我可查询的支持。该属性为我提供了从API中获得的大部分内容。 破坏我的是ODataFormatting,它将默认格式化程序替换为不支持POST上的集合的格式化程序

而且,似乎我通过删除ODataFormatting在功能上失去的唯一东西是在数据超过一页的情况下的延续标记,并且可能遵守OData规范

这都是因为OData在其规范中没有批量上传帖子吗? 是否有符合OData规范且受支持的替代方案


Microsoft.AspNet.WebApi.OData.5.1.2
Microsoft.AspNet.WebApi.Client.5.1.2
Newtonsoft.Json.6.0.2
注册:
//Web API配置和服务
ODataModelBuilder modelBuilder=新ODataConventionModelBuilder();
EntitySet(“MyObject”);
Microsoft.Data.Edm.IEdmModel model=modelBuilder.GetEdmModel();
config.Routes.MapODataRoute(“ODataRoute”,“api/v1”,模型);
//Web API路由
config.maphttpAttribute路由();
config.Routes.MapHttpRoute(
名称:“DefaultApi”,
routeTemplate:“api/v1/{controller}/{id}”,
默认值:新建{id=RouteParameter.Optional}
);

您需要使用批处理 或发布实体和相关实体的集合

但是对于您的场景(您只想添加多个记录),批处理似乎是使用OData的唯一方法

您的解决方案看起来不错,但我会确保您使用查询限制来限制查询功能。有关更多详细信息,请参阅此链接-

查询选项为客户端提供了对服务器上运行的查询的大量控制。在某些情况下,出于安全或性能原因,您可能希望限制可用选项。[Queryable]属性对此具有一些内置属性。这里有一些例子

仅允许$skip和$top,以支持分页而不支持其他内容: 仅允许按某些属性排序,以防止对数据库中未编制索引的属性进行排序: 允许“eq”逻辑功能,但不允许其他逻辑功能: 不允许使用任何算术运算符: 通过构造QueryableAttribute实例并将其传递给EnableQuerySupport函数,可以全局限制选项:
为什么不使用ODataController?ODataController是一个具有更新/创建虚拟功能的ODataController和ApiController。但是,我不支持/不能支持Put/Patch/delete我已经编辑了你的标题。请看,“,其中的共识是“不,他们不应该”。我明白你的观点,但我认为你是在将
EntitySetController
ODataController
混合。关于QueryableAttribute的精彩反馈-肯定会采纳这个建议。对于批处理,似乎我应该声明一个虚拟的“批处理”基本上包含MyObject列表的对象。然后他们可以通过POST上传包含列表的单个对象,这将符合OData规范。
{
-odata.error: {
    code: ""
    -message: {
    lang: "en-US"
    value: "The request is invalid."
  }
    -innererror: {
    message: "objectList : 'ODataFeedDeserializer' does not support Read. "
    type: ""
    stacktrace: ""
  }
}
Microsoft.AspNet.WebApi.OData.5.1.2
Microsoft.AspNet.WebApi.Client.5.1.2
Newtonsoft.Json.6.0.2
Registration:
// Web API configuration and services
ODataModelBuilder modelBuilder = new ODataConventionModelBuilder();
modelBuilder.EntitySet<MyObject>("MyObjects");

Microsoft.Data.Edm.IEdmModel model = modelBuilder.GetEdmModel();
config.Routes.MapODataRoute("ODataRoute", "api/v1", model);

// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
   name: "DefaultApi",
   routeTemplate: "api/v1/{controller}/{id}",
   defaults: new { id = RouteParameter.Optional }
);
[Queryable(AllowedQueryOptions=
    AllowedQueryOptions.Skip | AllowedQueryOptions.Top)]
[Queryable(AllowedOrderByProperties="Id")] // comma-separated list of properties
[Queryable(AllowedLogicalOperators=AllowedLogicalOperators.Equal)]
[Queryable(AllowedArithmeticOperators=AllowedArithmeticOperators.None)]
var queryAttribute = new QueryableAttribute()
{
    AllowedQueryOptions = AllowedQueryOptions.Top | AllowedQueryOptions.Skip,
    MaxTop = 100
};

config.EnableQuerySupport(queryAttribute);