Я пытаюсь реализовать функцию сбора данных OData, которая получает два DateTimeOffset? (MinSentOn и MaxSentOn) и вернет некоторую сводную информацию из таблицы Orders, но у меня возникают проблемы с маршрутизацией, когда я передаю временную часть DateTimeOffset, получив сообщение об ошибке HTTP 500. Ошибка внутреннего сервера непосредственно из IIS, поскольку кажется, он пытается достичь файла, а не самого контроллера.Функция OData с функцией DateTimeOffset? параметр
Это моя текущая конфигурация OData:
odataBuilder.Namespace = "D";
var fc =
odataBuilder.EntityType<Order>().Collection
.Function("ToExecutiveSummary")
.Returns<ExecutiveSummary>();
fc.Parameter<DateTimeOffset?>("MinSentOn");
fc.Parameter<DateTimeOffset?>("MaxSentOn");
Это функция в моем контроллере:
[HttpGet]
public async Task<IHttpActionResult> ToExecutiveSummary(DateTimeOffset? minSentOn, DateTimeOffset? maxSentOn, CancellationToken ct)
{
return await _uow.ExecuteAndCommitAsync(async() =>
{
var query = _uow.Orders.Query();
if (minSentOn != null) query = query.Where(e => e.SentOn >= minSentOn.Value);
if (maxSentOn != null) query = query.Where(e => e.SentOn <= maxSentOn.Value);
// TODO needs optimization, test only
var executiveSummary =
query.Select(e =>
new ExecutiveSummary
{
TotalOrders = query.Count(),
TotalProducts = query.Sum(ex => ex.Quantity),
TotalPharmacies = query.GroupBy(ex => ex.Pharmacy.Id, ex => ex.Pharmacy.Id).Count()
}).FirstOrDefault();
return Ok(executiveSummary);
}, ct);
}
Сниппает изменения web.config для поддержки пути OData и решить некоторые проблемы маршрутизации, с которыми я столкнулся, пока не ударил эту стену, как точки или двойные экраны (изменения имеют комментарии):
<configuration>
<!-- ... -->
<system.web>
<compilation debug="true" targetFramework="4.5.2" />
<!-- Removed : and % from the path filter -->
<httpRuntime targetFramework="4.5.2" requestPathInvalidCharacters="<,>,*,&,\,?"/>
<globalization uiCulture="pt-PT" culture="pt-PT" />
</system.web>
<!-- ... -->
<system.webServer>
<handlers>
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<remove name="OPTIONSVerbHandler" />
<remove name="TRACEVerbHandler" />
<!-- to support the dot (.) for functions or actions -->
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="/*" verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
<security>
<!-- to support double escapings, like 2015-08-10%2000:00:00.0000%2B01:00 -->
<requestFiltering allowDoubleEscaping="true"/>
</security>
</system.webServer>
<!-- ... -->
</configuration>
Теперь, во время моих тестирование, я столкнулся следующее:
Если я не передать часть времени (пример: http://localhost:58806/odata/Order/D.ToExecutiveSummary(MinSentOn=null,MaxSentOn=2015-08-10)) запрос достигает мой код без каких-либо проблем, заставляя меня поверить, что нет никаких проблем с конфигурацией и маршрутом OData. Но когда я включаю временную часть (пример: http://localhost:58806/odata/Order/D.ToExecutiveSummary(MinSentOn=null,MaxSentOn=2015-08-10%2000:00:00.0000%2B01:00)), я получаю внутреннюю ошибку сервера (изображение прикреплено) непосредственно от IIS. Кажется, он пытается решить файл вместо контроллера, откуда проблема.
В конце концов, я знаю, что я мог бы получить параметры в виде строк и сделать сам разобрать, но я хотел бы осуществить это без использования «молоток» :)
Я все еще получаю 500, не работает. К сожалению, тест на функции с датами не пропускает DateTimeOffset со временем, поэтому я могу попробовать: https://github.com/OData/WebApi/blob/master/OData/test/E2ETest/WebStack.QA.Test .OData/DateAndTimeOfDay/DateAndTimeOfDayTest.cs # L346 –