Asp.net web api 使用OData操作 版本

Asp.net web api 使用OData操作 版本,asp.net-web-api,odata,Asp.net Web Api,Odata,要使用$select和$expand等功能,请升级所有用于预发布版本的WebApi和OData软件包(从) Microsoft.AspNet.WebApi->5.0.0-beta1-130514 Microsoft.AspNet.WebApi.Client->5.0.0-beta1-130514 Microsoft.AspNet.WebApi.Core->5.0.0-beta1-130514 Microsoft.AspNet.WebApi.OData->5.0.0-beta1-130514 Mi

要使用
$select
$expand
等功能,请升级所有用于预发布版本的WebApi和OData软件包(从)

Microsoft.AspNet.WebApi->5.0.0-beta1-130514
Microsoft.AspNet.WebApi.Client->5.0.0-beta1-130514
Microsoft.AspNet.WebApi.Core->5.0.0-beta1-130514
Microsoft.AspNet.WebApi.OData->5.0.0-beta1-130514
Microsoft.AspNet.WebApi.Web…->5.0.0-beta1-130514

控制器 我的API控制器有一个基类:

public class baseApiController<T> : EntitySetController<T, int>
    where T: class, IEntity, new()
{
    public IRepository Repositorio { get; private set; }
    public baseApiController(IRepository repositorio)
    {
        Repositorio = repositorio;
    }

    [Queryable(AllowedQueryOptions = AllowedQueryOptions.All, PageSize=20)]
    public override IQueryable<T> Get()
    {
        return Repositorio.Query<T>();
    }

    [Queryable(AllowedQueryOptions = AllowedQueryOptions.All)]
    protected override T GetEntityByKey(int key)
    {
        return Repositorio.Get<T>(key);
    }
}
错误 获取:
/api/usuarios(67)/role

“此服务不支持格式为“~/entityset/key/action”的OData请求。”


ODataActions应该始终是POST请求。你能试着像下面这样修改你的代码,看看它是否能解决这个问题吗

[HttpPost, Queryable(AllowedQueryOptions = AllowedQueryOptions.All)]
public IQueryable roles([FromODataUri] int key, ODataActionParameters parameters) 
{
    var usuario = (from u in Repositorio.Query<Usuario>()
                where u.Id == key
                select new { u.Email }).SingleOrDefault();
    return Roles.GetRolesForUser(usuario.Email).AsQueryable();
}
[HttpPost,可查询(AllowedQueryOptions=AllowedQueryOptions.All)]
公共IQueryable角色([FromODataUri]int键,ODataActionParameters)
{
var usuario=(来自Repositorio.Query()中的u)
其中u.Id==key
选择新建{u.Email}).SingleOrDefault();
返回Roles.GetRolesForUser(usuario.Email).AsQueryable();
}
此外,在构建模型时不需要指定参数“key”,因为该key是从Uri本身检索的。更新代码如下:

modelBuilder.EntitySet<Usuario>("usuarios");
var entityTypeUsuario = modelBuilder.Entity<Usuario>();
var actRoles = entityTypeUsuario.Action("roles");
actRoles.Returns<string[]>();
modelBuilder.EntitySet(“usuarios”);
var entityTypeUsuario=modelBuilder.Entity();
var actRoles=entityTypeUsuario.Action(“角色”);
actRoles.Returns();

仅供参考:您还可以查看Mike关于OData操作的这篇文章:

在这种情况下,发布是有意义的,因为它只检索用户角色,而不在服务器上进行更改。如何创建为GET?理想情况下,您正在寻找OData函数(您可以在其中使用GET),这些函数目前不受开箱即用的支持。此外,如果您希望操作有任何参数,那么这些参数将来自主体,因此您将无法使用GET。如果您感兴趣,可以查看OData中的ActionRoutingConvention,看看我们是否专门检查POST请求:为什么我不能执行类似的操作:
public string[]GetRoles([FromODataUri]int key){//code here}
您可以创建自己的自定义路由约定,类似于我为实现这一点而提供的上面的链接,但是,当服务的元数据被公开时,它(通过FunctionImport元素)指示该操作为“IsSideEffecting=true”,这意味着该操作可能会导致副作用,而对于OData函数,该值将为“false”。因此,看到“IsSideEffecting=true”的客户端很可能会使用“POST”,因为它知道这是一个操作,并且有副作用,并且可以发布数据以更改状态。不支持GET!设计:操作将在有效负载中进行广告,就像今天的导航属性一样,有两个区别:您不能只关注操作的链接;他们有副作用,所以需要一个职位。有时操作也需要额外的参数。来自“您用于测试的客户端工具是什么?”@JasonSteele
[HttpPost, Queryable(AllowedQueryOptions = AllowedQueryOptions.All)]
public IQueryable roles([FromODataUri] int key, ODataActionParameters parameters) 
{
    var usuario = (from u in Repositorio.Query<Usuario>()
                where u.Id == key
                select new { u.Email }).SingleOrDefault();
    return Roles.GetRolesForUser(usuario.Email).AsQueryable();
}
modelBuilder.EntitySet<Usuario>("usuarios");
var entityTypeUsuario = modelBuilder.Entity<Usuario>();
var actRoles = entityTypeUsuario.Action("roles");
actRoles.Returns<string[]>();