2013-05-14 7 views
3

버전

(aspnetwebstack에서) 시험판 버전에 대한 모든 패키지 WebApi 및 하나로, OData를 업그레이드 $select$expand 등의 기능을 사용합니다.사용 중 하나로, OData 작업

Microsoft.AspNet.WebApi ->5.0.0-beta1-130514
Microsoft.AspNet.WebApi.Client ->5.0.0-beta1-130514
Microsoft.AspNet.WebApi. 코어 ->5.0.0-beta1-130514
Microsoft.AspNet.WebApi.OData ->5.0.0-beta1-130514
Microsoft.AspNet.WebApi.Web ... ->5.0.0 -β1-130514

컨트롤러

나는 기본 내 API의 controlers에 대한 클래스가 있습니다

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

그리고 사용자 컨트롤러

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

목표

액션을이 URL과 사용자의 모든 역할을 검색
목표는 다음과 같습니다 : 나는 나의 API WebApiConfig을 구성 /api/usuarios(67)/roles


은 다음과 같습니다 :특정 사용자에 대한 모든 역할을 검색

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; 

오류

GET : /api/usuarios(67)/role

"이 서비스는 '~/entityset/key/action'형식의 OData 요청을 지원하지 않습니다."

Erro WebAPI OData action

+0

어떤 클라이언트 도구를 사용하면 테스트를 위해 사용하는 : 당신은 또한 하나로, OData 조치에 대해 마이크에서이 좋은 포스트에서 볼 수 있습니까? –

+1

@ JasonSteele [Postman on Chrome Webstore] (https://chrome.google. – ridermansb

답변

6

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

또한,이 키가 열린 우리당 자체에서 검색으로 모델을 구축하는 동안 하지 매개 변수 '키'를 지정해야합니다. 참고로

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

: 아래의 업데이트 된 코드 http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/odata-actions

+0

이 경우 POST는 사용자의 역할 만 검색하고 서버에서는 변경하지 않기 때문에 의미가 있습니다. GET으로 어떻게 만들 수 있습니까? – ridermansb

+1

이상적으로는 현재 상자에서 지원되지 않는 OData 함수 (GET을 사용할 수있는 곳)를 찾고 있습니다. 또한 액션에 대한 매개 변수가 필요하다면 GET을 사용할 수 없으므로 본문에서 오는 것입니다. 궁금한 점이 있으면 OData의 ActionRoutingConvention를보고 POST 요청을 구체적으로 확인하십시오. http://aspnetwebstack.codeplex.com/SourceControl/latest#src/System.Web.Http.OData/OData /Routing/Conventions/ActionRoutingConvention.cs –

+0

'public string [] GetRoles ([FromODataUri] int key) {// 여기에 코드}' – ridermansb

관련 문제