Я интегрировал Swashbuckle.OData 3.2.0 и Swashbuckle.Core 5.5.3 в свой веб-сервис WepAPI OData для создания документации Swagger. Когда я пытаюсь получить доступ к конечной точке swagger (http://localhost:52460/swagger), я получаю следующее исключение , который, похоже, вызван функцией (AppointmentsForUsers), которая принимает 2 параметра типа Microsoft.OData.Edm.Date (тип даты без компонента времени). Когда я закомментировал var function = builder,Function...
part в своей функции Register, все работает нормально. Когда я заменяю тип параметра Microsoft.OData.Edm.Date на System.DateTimeOffset, он также работает нормально, но это не решение для нас / нашего проекта.
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
ODataModelBuilder builder = new ODataConventionModelBuilder();
builder.EntitySet<UserDTO>("Users");
builder.EntitySet<AppointmentDTO>("Appointments");
var function = builder.Function("AppointmentsForUsers");
function.ReturnsCollectionFromEntitySet<AppointmentDTO>("Appointments");
function.Parameter<Date>("FromDate");
function.Parameter<Date>("ToDate");
function.CollectionParameter<int>("UserIds");
config.MapODataServiceRoute(
routeName: "odata",
routePrefix: "odata",
model: builder.GetEdmModel());
}
}
public async Task<IHttpActionResult> AppointmentsForUsers(Date DateFrom, Date DateTo, Enumerable<int> UserIds)
{
...
}
Ошибка, которую я получаю в браузере:
немецкая часть сообщения
Der DateTimeOffset-Text \ "2015-12-12T12: 00 \" sollte das Format \ "yyyy-mm-ddThh: mm: ss ('.' S +)? (Zzzzzz)? \" Aufweisen, und jeder Feldwert muss innerhalb des gültigen Bereichs liegen ".
означает: текст DateTimeOffset \ "2015-12-12T12: 00 \" должен иметь формат \ "yyyy-mm-ddThh: mm: ss ('.' s +)? (zzzzzz)? \" и каждое значение поля должно быть в допустимом диапазоне
m DateTimeOffset-Wert '2015-12-12T12: 00: 00' fehlen die Zeitzoneninformationen. Ein DateTimeOffset-Wert muss Zeitzoneninformationen enthalten ".
означает: в значении DateTimeOffset отсутствует информация о часовом поясе. Значение DateTimeOffset должно содержать информацию о часовом поясе.
Это ошибка? Есть ли обходной путь (кроме отказа от типа даты)? Любая помощь приветствуется.
Я также открыл проблему на сайте Swashbuckle.Odata Github: https://github.com/rbeauchamp/Swashbuckle.OData/issues/134
Обновление: в качестве временного решения я изменил типы параметров на System.DateTime.
с этим обходным путем я все еще могу использовать дату в качестве параметра, например AppointmentsForUsers (DateFrom = 2017-04-07, .... Фактический параметр содержит компонент времени (в зависимости от часового пояса), но затем внутренне я продолжаю использовать Date (неявное преобразование из DateTime). По крайней мере, для нас работает хорошо, хотя исходная проблема все еще сохраняется.
public async Task<IHttpActionResult> AppointmentsForUsers(DateTime DateFrom, DateTime DateTo, Enumerable<int> UserIds)
{
...
}
Если использование действия вместо функции может быть решением ... пробовали ли вы использовать действие, получающее объект ODataActionParameters в качестве параметра, как описано здесь ?: