操作上的路径模板不是有效的OData路径模板

时间:2017-10-19 12:17:18

标签: c# odata entity

我在OData控制器中定义了POST方法:

    [HttpPost]
    [ODataRoute("Users/BulkUserUpdate/")]
    public HttpResponseMessage BulkUserUpdate([FromBody] BulkUserUpdateModel bulkModel)
    {
        try
        {
            foreach (Guid userId in bulkModel.UserIds)
            {
                ...
            }
            ...
            return Request.CreateResponse(HttpStatusCode.OK);
        }
        catch (Exception e)
        {
            ...
            return Request.CreateResponse(HttpStatusCode.BadRequest);
        }
    }

启动应用程序时出现错误:控制器“用户”中操作“BulkUserUpdate”上的路径模板“Users / BulkUserUpdate /”不是有效的OData路径模板。错误请求 - 查询语法错误。

我在EntityDataModel中的配置:

var userType = builder.EntitySet<UserModel>("Users").EntityType;
ActionConfiguration bulkUserUpdate = userType.Action("BulkUserUpdate");

1 个答案:

答案 0 :(得分:1)

OjamaYellow

关注OData Spec,它说:

要调用绑定到资源的操作,客户端会向操作URL发出POST请求。可以从先前返回的实体表示获得动作URL,或者通过将名称空间或别名限定的动作名称附加到URL来标识与其类型相同或源自的资源,动作的绑定参数的类型。

因此,您的[ODataRoute("Users/BulkUserUpdate/")]有两个问题:

  1. 您应该使用名称空间限定的操作名称来调用操作。例如:~.. /YourNameSapce.BulkUserUpdate

  2. 您的操作绑定到非集合类型,因此您应该对非集合调用操作。

  3. 因此,正确的属性路由字符串应为:

    [ODataRoute(Users({myKey})/YourNamespace.BulkUserUpdate")]
    

    你控制器中的方法应该有一个参数来接受“myKey”。

    public HttpResponseMessage BulkUserUpdate([FromODataUri]string myKey, [FromBody] BulkUserUpdateModel bulkModel)
    

    =========================更新10/20/2017 =============== < / p>

    OjamaYellow的回应:

    但如果我不想在我的网址中输入密钥怎么办?所以我实际上想要有未绑定的动作

    对于未绑定的操作,您可以直接从“构建器”调用“操作”方法,例如:

    ActionConfiguration actionConfig = builder.Action("xxx");

    通过操作导入调用未绑定的操作,关注OData Spec说:

    通过操作导入调用操作,客户端向标识操作导入的URL发出POST请求。操作导入的规范URL是服务根,后跟操作导入的名称

    因此,未绑定操作的正确属性路由字符串应为:

    [ODataRoute("yourActionImportName")]

    ============= update 10/24/2017 =========

    如果你想使用Users/BulkUserUpdate,那就是限制在实体集合上的行动。

    因此,在模型构建器中,您应该调用:

    var userType = builder.EntitySet<UserModel>("Users").EntityType;
    ActionConfiguration bulkUserUpdate = userType.Collection.Action("BulkUserUpdate");
    

    请注意userType之后的“收集”来电。

    另外,请更改控制器中的[ODataRoute(“...”)]。 希望它可以提供帮助。