В настоящее время у меня есть C # WebAPI, использующий написанную нами версию OData. Мы хотим начать использовать OData4 от Microsoft, который может больше, чем наша индивидуальная реализация.
Создание контроллера, расширяющего ODataController, я могу создать контроллер, который автоматически запрашивает на основе строки запроса. (Показано ниже)
Проблема в том, что он возвращает результаты запроса, когда я хочу, чтобы он возвращал объект Result
, который включает дополнительные данные. Когда я устанавливаю тип возвращаемого значения на Результат, хотя он больше не будет применять строку запроса.
Как я могу использовать автоматическую реализацию запроса и по-прежнему возвращать свой собственный объект? Я попытался создать общедоступный метод, который возвращает правильный объект и вызывает частный метод, возвращающий запрашиваемый, но он не фильтрует запрашиваемый правильно.
На правильном ли я пути или есть другие варианты?
public class CallController : ODataController
{
[EnableQuery]
public IQueryable<Call> GetCall()
{
var list = new List<Call>
{
new Call
{
Id = 4
},
new Call
{
Id = 9
},
new Call
{
Id = 1
}
};
return list.AsQueryable();
}
}
public class Call
{
public int Id { get; set; }
}
public class Result
{
public Call[] Calls { get; set; }
public string NewToken { get; set; }
public string Warning { get; set; }
}
3 ответа
Под капотом атрибут EnableQuery
выполняет действие, которое он украшает, чтобы получить IQueryable<T>
, преобразовывая запрос odata во что-то, что можно применить к IQueryable<T>
, применяя его и возвращая результаты .
Для работы ему нужен IQueryable<T>
.
ODataQueryOptions
и пример в ответе Ihar могут дать вам то, что вы хотите, но по разным причинам это было не так полезно для меня, как EnableQuery
, и поэтому я получил средство форматирования вывода.
Вы можете проверить первые средства форматирования вывода в services.AddMvc(options => { options.OutputFormatters }
в Startup.ConfigureServices
и увидеть, что первый имеет набор различных видов полезной нагрузки.
Мне удалось вставить собственный обработчик ошибок для обработки полезной нагрузки ODataPayloadKind.Error
- переписать содержимое, возвращаемое с сервера, чтобы удалить следы стека и т. Д., Если не в режиме разработки. Я не рассматривал случаи, не связанные с ошибками, но вы можете использовать то, что у меня есть здесь в качестве отправной точки.
Используйте ODataQuertOptions вместо атрибута [EnableQuery]. Отметьте https://docs.microsoft.com/en-us/aspnet/web-api/overview/odata-support-in-aspnet-web-api/supporting-odata -query-options # invoking-query-options-напрямую
Вам нужно будет перехватить ответ с помощью атрибута фильтра действий в onactionexecuted и преобразовать значение во все, что вы хотите. Это было бы некрасиво, так как было бы непонятно, какой метод действительно возвращает. Но я не вижу другого варианта с odata, так как результат должен быть извлекаемым.
Похожие вопросы
Связанные вопросы
Новые вопросы
c#
C# (произносится как «see Sharp») — это высокоуровневый мультипарадигменный язык программирования со статической типизацией, разработанный Microsoft. Код C# обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, которое включает в себя .NET, .NET Framework, .NET MAUI и Xamarin среди прочих. Используйте этот тег для ответов на вопросы о коде, написанном на C#, или о формальной спецификации C#.