2014-11-04 2 views
1

Im пытается написать общий PageResult, который я добавил к базовому контроллеру.Использование PageResult в базе ApiController возвращает System.ArgumentNullException

[EnableQuery] 
    [HttpGet] 
    [Route(""] 
    public virtual PageResult<TListModel> Get(ODataQueryOptions<TListModel> options) 
    { 
     ODataQuerySettings settings = new ODataQuerySettings() 
     { 
      PageSize = 25, 
     }; 

     IQueryable results = options.ApplyTo(DomainService.GetQueryable(), settings); 
     var items = results as IQueryable<TListModel>; 
     // return new PageResult<TListModel>(items, Request.ODataProperties().NextLink,DomainService.GetQueryable().Count()); 
     return new PageResult<TListModel>(items, Request.ODataProperties().NextLink, Request.ODataProperties().TotalCount); 

    } 

Теперь, когда я пытаюсь позвонить АНИ ENDPOINT

/endpoint?$select=Title 

Я получаю сообщение об ошибке

Значение не может быть пустым \ \ Имя параметра:. Источник

Если Я удаляю ?$select=Title Я могу вызвать api, и результаты будут возвращены.

Есть ли что-то еще, что я должен сделать, чтобы включить это? Источник имени параметра ... Я понятия не имею, что это такое?

Полный StackTrace

"в System.Linq.Queryable.Count [TSource] (IQueryable 1 source)\ \ at Api.EndPoints.BaseController 5.Получить (ODataQueryOptions 1 options) in e:\\@Source\\Web\\Api\\.EndPoints\\BaseController.cs:line 62\ \ at lambda_method(Closure , Object , Object[])\ \ at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass10.<GetExecutor>b__9(Object instance, Object[] methodParameters)\ \ at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(Object instance, Object[] arguments)\ \ at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext, IDictionary 2 аргументы, CancellationToken CancellationToken) \ \ --- Конец трассировки стека из предыдущее место, где было выбрано исключение --- \ \ at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (задача задачи) \ \ at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (задача задачи) \ \ в System.Runtime.CompilerServices. TaskAwaiter 1.GetResult()\ \ at System.Web.Http.Controllers.ApiControllerActionInvoker.<InvokeActionAsyncCore>d__0.MoveNext()\ \ --- End of stack trace from previous location where exception was thrown ---\ \ at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\ \ at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\ \ at System.Runtime.CompilerServices.TaskAwaiter 1.GetResult() \ \ at System.Web.Http.Filters.ActionFilterAttribute.d__5.MoveNext() \ \ --- Конец трассировки стека из предыдущего места, где исключение было t hrown --- \ \ at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() \ \ at System.Web.Http.Filters.ActionFilterAttribute.d__5.MoveNext() \ \ --- Конец трассировки стека из предыдущего места, где исключение был брошен --- \ \ в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (задача задачи) \ \ at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (задача задачи) \ \ at System.Runtime.CompilerServices.TaskAwaiter 1.GetResult()\ \ at System.Web.Http.Filters.ActionFilterAttribute.<ExecuteActionFilterAsyncCore>d__0.MoveNext()\ \ --- End of stack trace from previous location where exception was thrown ---\ \ at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\ \ at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\ \ at System.Runtime.CompilerServices.TaskAwaiter 1. GetResult() \ \ at System.Web.Http.Controllers.ActionFilterResult.d__2.MoveNext() \ \ --- Конец трассировки стека из предыдущего места, где было выбрано исключение - \ \ at System.Runtime.CompilerServices.TaskAwaiter .ThrowForNonSuccess (задача задачи) \ \ at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (задача задачи) \ \ в System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() \ \ at System.Web.Http.Dispatcher.HttpControllerDispatcher .d__1.MoveNext() "

+0

Это потому, что после метода ApplyTo результаты не относятся к типу IQueryable , а представляют собой частичную коллекцию проектов TListModel. – Karata

ответ

0

Я обновил свое решение до последней версии веб-API, и это обозначено как obolete, но работает.

[HttpGet, Route("Get")] 
    public PageResult<DiplomateModel> Get(int legalValue, string area =              null, int? pageSize = 20,ODataQueryOptions<Model> options = null) 
    { 
     try 
     { 
      var ret = GetUsers(legalValue, area); 
      var settings = new ODataQuerySettings 
      { 
       PageSize = pageSize 
      }; 
      IQueryable results = options.ApplyTo(ret, settings); 
      var uri = Request.GetNextPageLink(); 
      long? inLineCount = Request.GetInlineCount(); 
      var response = new PageResult<DiplomateModel>(results as IEnumerable<Model>,uri,inLineCount); 
      return response; 
     } 
     catch (Exception ex) 
     { 
      LogError(ex); 
      return null; 
     } 
    } 
0

О да, единственная причина, по которой ваш код не работает, из-за декоратора [EnableQuery]. Удалите это, и вам должно быть хорошо идти. EnableQuery() предотвратит ваш звонок. EnableQuery только защищает метод от вредоносных запросов, но если ваша подпись строго типизирована, это не должно быть проблемой.

Смежные вопросы