gpt4 book ai didi

asp.net-web-api - 使用 OData 操作

转载 作者:行者123 更新时间:2023-12-01 10:54:06 24 4
gpt4 key购买 nike

版本

要使用 $select$expand 等功能,请升级预发布版本的所有包 WebApi 和 OData(来自 aspnetwebstack)。

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

Controller

我的 API Controller 有一个基类:

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);
}
}

还有一个用户 Controller

[Authorize]
public class usuariosController : baseApiController<Usuario>
{
public usuariosController(IRepository repositorio)
: base(repositorio)
{ }

[Authorize(Roles="Admin,TI")]
public HttpResponseMessage post(Usuario usuario)
{
var x = WebSecurity.CreateUserAndAccount(usuario.Email, "maisbb", new { Nome = usuario.Nome }); //TODO: Não fixar senha
Repositorio.Store(usuario);

return Request.CreateResponse(HttpStatusCode.OK, usuario);
}

[HttpGet, Queryable(AllowedQueryOptions = AllowedQueryOptions.All)]
public IQueryable roles([FromODataUri] int key)
{
var usuario = (from u in Repositorio.Query<Usuario>()
where u.Id == key
select new { u.Email }).SingleOrDefault();
return Roles.GetRolesForUser(usuario.Email).AsQueryable();
}
}

目标

roles 操作检索特定用户的所有角色:
目标是使用此 URL检索用户的所有角色:
/api/usuarios(67)/roles

我按如下方式配置了我的 API WebApiConfig:

modelBuilder.EntitySet<Usuario>("usuarios");
var entityTypeUsuario = modelBuilder.Entity<Usuario>();
var actRoles = entityTypeUsuario.Action("roles");
actRoles.Parameter<int>("key");
actRoles.Returns<string[]>();

...

var model = modelBuilder.GetEdmModel();
config.Routes.MapODataRoute(routeName: "OData", routePrefix: "api", model: model);
config.EnableQuerySupport();
var jsonFormatter = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
var enumConverter = new StringEnumConverter();
jsonFormatter.SerializerSettings.Converters.Add(enumConverter);
config.Formatters.Remove(config.Formatters.XmlFormatter);
var jqueryFormatter = config.Formatters.FirstOrDefault(x => x.GetType() == typeof(JQueryMvcFormUrlEncodedFormatter));
config.Formatters.Remove(config.Formatters.XmlFormatter);
config.Formatters.Remove(config.Formatters.FormUrlEncodedFormatter);
config.Formatters.Remove(jqueryFormatter);
config.Formatters.JsonFormatter.SerializerSettings.DateFormatHandling = DateFormatHandling.IsoDateFormat;

错误

获取:/api/usuarios(67)/role

"This service doesn't support OData requests in the form '~/entityset/key/action'."

Erro WebAPI OData action

最佳答案

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();
}

此外,您需要在构建模型时指定参数“键”,因为此键是从 Uri 本身检索的。更新代码如下:

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

仅供引用:您还可以查看 Mike 关于 OData 操作的这篇精彩帖子:http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/odata-actions

关于asp.net-web-api - 使用 OData 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16550705/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com