Функция OData с параметрами Microsoft.OData.Edm.Date вызывает ошибку в Swashbuckle

Я интегрировал 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 в качестве параметра, как описано здесь ?:


person jps    schedule 30.03.2017    source источник


Ответы (1)


https://docs.microsoft.com/en-us/aspnet/web-api/overview/odata-support-in-aspnet-web-api/odata-v4/odata-actions-and-functions

Другой альтернативой может быть создание модели с тремя параметрами и передача ее как ODataActionParameter.

public async Task<IHttpActionResult> AppointmentsForUsers(ODataActionParameters parameters) 
{
    Date fromDate = (Date)parameters["FromDate"];
    Date toDate = (Date)parameters["ToDate"];
    Enumerable[int] UserIds= (Enumerable[int])parameters["UserIds"];
}

500: {"Сообщение": "Произошла ошибка.", "ExceptionMessage": "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.", "ExceptionType": "Microsoft.OData.ODataException", "StackTrace": "bei Microsoft.OData.UriUtils. ConvertUriStringToDateTimeOffset (текст строки, DateTimeOffset и targetValue) \ r \ n через Microsoft.OData.UriParser.ExpressionLexer.TryParseDateTimeoffset (Int32 tokenPos) \ r \ n через Microsoft.OData.UriParser.ExpressionFromer.Data.UriParser.ExpressionFromer. .UriParser.ExpressionLexer.NextTokenImplementation (Исключение и ошибка) \ r \ n в Microsoft.OData.UriParser.ExpressionLexer.NextToken () \ r \ n в Microsoft.OData.UriParser.FunctionParameterParser.TrySplitOperationParameters_1 \ r \ n через Microsoft.OData.UriParser.ODataPathParser.TryBindingParametersAndMatchingOperationImp ort (строковый идентификатор, строковое выражение скобок, конфигурация ODataUriParserConfiguration, сегменты ICollection_4_1) \ r \ n через Microsoft.OData.UriParser.ODataPathFactory.BindPath (ICollection_5_2.MoveNext () \ r \ n через System.Linq.Enumerable_d__16 \ r \ n через System.Linq.Enumerable.d__16_7_1..ctor (исходный код IEnumerable_8_1) \ r \ n через Swashbuckle.OData.CollectionExtentions.ToCollection [T] (IEnumerable_9_1.CreateValue () \ r \ n через System.Lazy_Value_1.get () \ r \ n через Swashbuckle.OData.Descriptions.ODataApiExplorer.get_ApiDescriptions () в C: \ Users \ rbeauchamp \ Documents \ GitHub \ Swashbuckle.OData \ Swashbuckle.OData \ Descriptions \ ODataApiExplorer.cs: Zeile 39. \ r n bei Swashbuckle.OData.ODataSwaggerProvider.GetApiDescriptionsFor (String apiVersion) в C: \ Users \ rbeauchamp \ Documents \ GitHub \ Swashbuckle.OData \ Swashbuckle.OData \ ODataSwaggerProvider.cs: ZeileSwiderProvider.cs: ZeileSwagger.cs: Zeile 297. .GetSwagger (String rootUrl, String apiVersion) в C: \ Users \ rbeauchamp \ Documents \ GitHub \ Swashbuck le.OData \ Swashbuckle.OData \ ODataSwaggerProvider.cs: Zeile 57. \ r \ n bei Swashbuckle.Application.SwaggerDocsHandler.SendAsync (запрос HttpRequestMessage, CancellationToken cancellationToken) \ r \ n beiRequestMessage.System.Net. request, CancellationToken cancellationToken) \ r \ n через System.Web.Http.Dispatcher.HttpRoutingDispatcher.SendAsync (запрос HttpRequestMessage, CancellationToken cancellationToken) \ r \ n через System.Net.Http.DelegatingHandler. SendAsync (запрос HttpRequestMessage, CancellationToken cancellationToken) \ r \ n через System.Web.Http.HttpServer.d__0.MoveNext () "," InnerException ": {" Сообщение ":" Произошла ошибка. "," ExceptionMessage ":" Im DateTimeOffset-Wert '2015-12-12T12: 00: 00' fehlen die Zeitzoneninformationen. Ein DateTimeOffset-Wert muss Zeitzoneninformationen enthalten. "," ExceptionType ":" System.FormatException "," StackTrace ":" в Microsoft.OData.PlatformHelper.ValidateTimeZoneInformationInDateTimeOffsetTring (Microsoft.ValidateTimeZoneInformationInDateTimeOffsetTring (текст строки) \ rODSet.i Текст строки) \ r \ n bei Microsoft.OData.UriUtils.ConvertUriStringToDateTimeOffset (текст строки, DateTimeOffset & targetValue) "}} http://localhost:52460/swagger/docs/v1

 var function = builder.Action("AppointmentsForUsers");
        function.ReturnsCollectionFromEntitySet<AppointmentDTO>("Appointments");
        function.Parameter<ModelWithDatesAndUsers >("Model");

public class ModelWithDatesAndUsers
{
    Date fromDate;
    Date toDate;
    Enumerable[int] userIds;
}

public async Task<IHttpActionResult> AppointmentsForUsers(ODataActionParameters parameters) 
{
         ModelWithDateAndUsers model= (ModelWithDatesAndUsers)parameters["Model"];        
}
person Cibergarri    schedule 08.05.2017