rid*_*nsb 3 odata asp.net-web-api
使用类似的功能$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
我的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);
}
}
Run Code Online (Sandbox Code Playgroud)
和一个用户控制器
[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();
}
}
Run Code Online (Sandbox Code Playgroud)
操作roles检索特定用户
的所有角色:目标是使用以下URL 检索用户的所有角色:
/api/usuarios(67)/roles
我WebApiConfig按如下方式配置了我的API :
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;
Run Code Online (Sandbox Code Playgroud)
得到: /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();
}
Run Code Online (Sandbox Code Playgroud)
另外,你需要不指定参数的"钥匙",同时构建模型,因为这关键是从乌里本身检索.更新的代码如下:
modelBuilder.EntitySet<Usuario>("usuarios");
var entityTypeUsuario = modelBuilder.Entity<Usuario>();
var actRoles = entityTypeUsuario.Action("roles");
actRoles.Returns<string[]>();
Run Code Online (Sandbox Code Playgroud)
仅供参考:你也可以看看迈克关于OData行动的好帖子:http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/odata-actions
| 归档时间: |
|
| 查看次数: |
5521 次 |
| 最近记录: |